对于一颗生成树来说,我们生成的过程是一条边一条边的增加的,所以我们只需要建立一个数组path[]来记录我们都选择了那些边,之后使用path[]来建边遍历。
记录部分:
void Kruskal() { int num=0,j=0; for(int i=1;i<=n;++i) f[i]=i; for(int i=1;i<=m;++i) { int eu=find(edge[i].from); int ev=find(edge[i].to); if(eu^ev) { f[eu]=ev; path[++j]=edge[i]; num++; } if(num==n-1) break; } final=j; }
遍历部分:
for(int i=1;i<=final;++i) addedge(path[i].from,path[i].to),addedge(path[i].to,path[i].from); vis[1]=1; get_col(1,1); void get_col(int x,int c) { col[x]=c; for(int i=head[x];i;i=_edge[i].next) if(!vis[_edge[i].to]) { vis[_edge[i].to]=1; get_col(_edge[i].to,c^1); } } void addedge(int from,int to) { _edge[++num_edge].from=from; _edge[num_edge].to=to; _edge[num_edge].next=head[from]; head[from]=num_edge; }