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

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

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值