Lưu danh sách kề bằng mảng head và adj

#include <bits/stdc++.h>

using namespace std;

const int NODE = 100000;
const int EDGE = 100000;
int numNode, numEdge;
pair<int,int> edge[EDGE];
int head[NODE], adj[EDGE*2];

int main() {
   // các đỉnh có chỉ số từ 1 -> numNode
   cin >> numNode >> numEdge;
   for (int i = 0; i < numEdge; ++i) {
       cin >> edge[i].first >> edge[i].second;
       head[edge[i].first]++;
       head[edge[i].second]++;
   }
   for (int i = 1; i <= numNode+1; ++i) {
       head[i] += head[i-1];
   }
   for (int i = 0; i < numEdge; ++i) {
       adj[--head[edge[i].first]] = edge[i].second;
       adj[--head[edge[i].second]] = edge[i].first;
   }
   for (int u = 1; u <= numNode; ++u) {
       cout << u << ": ";
       for (int i = head[u]; i < head[u+1]; ++i) {
           cout << adj[i] << ' ';
       }
       cout << '\n';
   }
   return 0;
}