輸入 u - v 表示一邊的2個端點函數
struct edge { int from; int to; int next; } e[MAXN]; int head[MAXN]; //head[u]表示 以u爲父節點的邊鏈表的頭
void build(int u, int v) { e[cnt].from = u; e[cnt].to = v; e[cnt].next = head[u];// next = 以前u爲父節點的邊的編號 head[u] = cnt;//更新head[u] cnt++; } cin>>u>>v; build(u,v); build(v,u);
void dfs(int u) { int edge = head[u]; for(int i = edge; i != -1; i = e[i].next ) { vis[u] = 1; int v = e[i].to; if(vis[v] == 0) { dfs(v); } } return ; }
整體方法是head[u]存放以u(頂點)爲from的邊的編號,經過head[u]找到一條邊,而且這條邊是 一系列以u爲from的邊 組成的鏈表的頭,經過這個頭用鏈表的方式(e[i].next)去遍歷全部以u爲from的邊 。 因此數據類型是這樣的 : head[頂點編號] = 邊的編號 ; e[邊的編號].next = 邊的編號 。ui