最小生成树
kruskal:
输入:边集E
for each <u,v> in E
//用并查集实现
if u.root != v.root //u v 不在同一集合(不会产生回路)
union(u,v)//加入变<u,v>
合并同时记录边数,由于n个点的生成树只有n-1条边,一旦加够了,就停
并查集的实现~
//并查集的实现 int root[MAXN];//记录每个节点的根节点 void init(int x)//初始化 { for(int i=0;i<x;i++)root[i]=i;//每个节点开始时独立 } int getroot(int x)//取出根节点,顺便压缩路径 { if(x!=root[x])root[x]=getroot(root[x]); return root[x]; } inline int unionset(int x1,int x2)//合并俩集合 { int a=getroot(x1),b=getroot(x2); root[a]=b; }