实现Kruskal算法,求图的最小生成树。

来源:互联网 发布:淘宝高颜值零食店铺 编辑:程序博客网 时间:2024/05/17 06:02

输入:顶点编号及边权重。例:

0 1 10

0 2 151

1 2 50

输出:最小生成树。例:

0 1 10

0 2 15

源代码:

#include <iostream>

#include <cstdio>

#include <algorithm>

 

using namespace std;

 

struct Edge{

    int x;

    int y;

    int w;

};

 

const int MAXN = 100;

int pa[MAXN];

int rank[MAXN];

 

int cmp(Edge a,Edge b){

    return a.w < b.w;

}    //交换函数,按从小到大排序

 

void make_set(int x){

    pa[x] = x;

    rank[x] = 1;

}   //初始化函数

 

int find_set(int x){

    if(x != pa[x])

        pa[x]=find_set(pa[x]);

    return pa[x];

}

 

bool union_set(int x,int y){

    x = find_set(x);

    y = find_set(y);

    if(x == y)

        return false;

    if(rank[x] > rank[y])

    {

        pa[y] = x;

    }

    else{

        pa[x] = y;

        if(rank[x] == rank[y])

            rank[y]++;

    }

    return true;

}    // 并查集

 

int main()

{

int n, ltotal;

Edge edge[MAXN];

scanf("%d", &n);

while(n--)

{

    int v,l;

scanf("%d%d", &v, &l);

ltotal = 0;

for(int i = 1;i <= v;i++)

            make_set(i);

for(int i = 1; i <= l ; i++)

{

scanf("%d%d%d", &edge[i].x, &edge[i].y, &edge[i].w);

}

sort(edge + 1, edge + 1 + l, cmp);

for(int i = 1; i <= l; i++)

{

if(union_set(edge[i].x, edge[i].y))

{

ltotal++;

printf("%d %d %d\n",edge[i].x,edge[i].y,edge[i].w);

}

if(ltotal == v - 1)

{

break;

}

}

}

return 0;

}

0 0
原创粉丝点击