kruskal 生成最小树

来源:互联网 发布:sugarnmstool 源码 编辑:程序博客网 时间:2024/06/10 09:55

kruskal 算法在排序上最费时,生成树过程复杂度是线性的,所以最终复杂度为o(|E|log|E|)。
可以对比一下prim算法
传送门》》题目链接

#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>#define INF 0x3f3f3f3fusing namespace std;int cost[26][26];int V,E;int par[26];struct edge{int from,to,val;}e;//val from 到 to的距离值edge es[26*13+2];bool cmp(edge x,edge y){return x.val<y.val;}void init(){for(int i=0;i<26;i++) par[i]=i;}int find(int x){return x==par[x]?x:par[x]=find(par[x]);}void unite(int x,int y){par[find(y)]=find(x);}bool same(int x,int y){return find(x)==find(y);}int kruskal(){    sort(es,es+E,cmp);    init();    int res=0;    for(int i=0;i<E;i++){        if(!same(es[i].from,es[i].to)){            unite(es[i].from,es[i].to);            res+=es[i].val;        }    }    return res;}int main(){    while(~scanf("%d",&V)&&V){        memset(cost,0x3f,sizeof(cost));        int N,val;char a[2],b[2];        E=0;        for(int i=0;i<V-1;i++){            scanf("%s%d",a,&N);            if(N<=0) continue;            int x=*a-'A';            while(N--){                scanf("%s%d",b,&val);                int y=*b-'A';                es[E].from=x;es[E].to=y;es[E].val=val;E++;            }        }        printf("%d\n",kruskal());    }    return 0;}
0 0