For a spanning tree, we generate an edge of one side of the process is increased, so we only need to create an array of path [] to record those we have chosen to side, then use the path [] to build edge traversal.
Record section:
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; }
Traverse sections:
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; }