输入 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