voidgetGraph(int n, int m) { int u, v; for (int i = 0; i < m; i++) { cin >> u >> v; graph[u][++graph[u][0]] = v; //无向图graph[v][++graph[v][0]] = u; } }
1 2 3 4 5
//查找与x相连的点 for(int i = 1; i < graph[x][0]; i++) { cout << graph[x][i]; }
vector
graph[i].size()表示和第i个顶点相连的点有多少个,graph[i][j]与上面相同。
1 2 3 4 5 6 7 8 9 10 11
vector<int> graph[MAX]; voidgetGraph(int n, int m) { int u, v; for(int i = 0; i < m; i++) { cin >> u >> v; graph[u].push_back(v); //无向图graph[v].push_back(u); } }
1 2 3 4 5
//查找与x相连的点 for(int i = 0; i < graph[x].size(); i++) { cout << graph[x][i]; }
链式前向星
首先定义一个边的结构体。
1 2 3 4 5 6
structEdge { int to;//表示该边指向的节点 int nextEdge;//表示下一条边的序号 int weigh;//权值 }edge[MAX];
voidaddEdge(int u, int v) { cin >> u >> v; edge[++cnt].to = v; edge[cnt].nextEdge = head[u]; head[u] = cnt; } voidgetGraph(int n, int m) { int u, v; addEdge(u, v); //无向图addEdge(v, u); }
1 2 3 4 5 6 7
//事实上当我们查找与x相连的点的时候都是先从最后一条边所指开始。 //所以head[i]表示的也许是最后读取的"第一条边"? //当edge[i].nextEdge == 0时表示当前边为最后一条边(第一条边?) for(int i = head[x]; i != 0; i = edge[i].nextEdge) { cout << edge[i].to; }