如果看不懂輔助解釋在后面第5點
1、錄入方式:
輸入 u - v 表示一邊的2個端點
2、存儲結構
struct edge { int from; int to; int next; } e[MAXN]; int head[MAXN]; //head[u]表示 以u為父節點的邊鏈表的頭
3、建圖方法
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);
4、DFS函數編寫
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 ; }
5、一些解釋:
總體方法是head[u]存放以u(頂點)為from的邊的編號,通過head[u]找到一條邊,並且這條邊是 一系列以u為from的邊 組成的鏈表的頭,通過這個頭用鏈表的方式(e[i].next)去遍歷所有以u為from的邊 。 所以數據類型是這樣的 : head[頂點編號] = 邊的編號 ; e[邊的編號].next = 邊的編號 。