最小生成树之Prim 和 Kruskal算法

来源:互联网 发布:淘宝真鞋店铺 编辑:程序博客网 时间:2024/06/18 15:00


struct Edge{    int u, v, w;};struct Edge edge[10010];int f[2010];bool cmp(Edge e1, Edge e2){    if(e1.w < e2.w)        return true;    else        return false;}int getf(int v){    if(f[v] == v)        return v;    else    {        f[v] = getf(f[v]);        return f[v];    }}int Merge(int u, int v){    int t1, t2;    t1 = getf(u);    t2 = getf(v);    if(t1 != t2)    {        f[t1] = t2;        return 1;    }    return 0;}int main(){    int N, M;    scanf("%d %d", &N, &M);    for(int i = 0; i < M; i++)    {        scanf("%d %d %d", &edge[i].u, &edge[i].v, &edge[i].w);    }    sort(edge, edge+M, cmp);    for(int i = 1; i <= N; i++)        f[i] = i;    int Count = 0, ans = 0, sum = 0;    for(int i = 0; i < M; i++)    {        if(Merge(edge[i].u, edge[i].v))        {            Count++;            ans = edge[i].w; //求最小生成树上的最大边            sum += edge[i].w; //求最小生成树的各边长权值之和        }        if(Count == N-1)            break;    }    cout << ans << endl;    return 0;}