最小生成树

 

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;
}