Kruskal算法(求最小生成树)

来源:互联网 发布:java doc 编辑:程序博客网 时间:2024/04/28 11:25
代码:
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;#define maxn 110    //最多点个数int n, m;   //点个数,边数int parent[maxn];   //父亲节点,当值为-1时表示根节点int ans;    //存放最小生成树权值struct eage     //边的结构体,u、v为两端点,w为边权值{    int u, v, w;}EG[5010];bool cmp(eage a, eage b)    //排序调用{    return a.w < b.w;}int Find(int x)     //寻找根节点,判断是否在同一棵树中的依据,可以路径压缩{    if(parent[x] == -1) return x;    return Find(parent[x]);}void Kruskal()      //Kruskal算法,parent能够还原一棵生成树,或者森林{    memset(parent, -1, sizeof(parent));    sort(EG+1, EG+m+1, cmp);    //按权值将边从小到大排序    ans = 0;    for(int i = 1; i <= m; i++)     //按权值从小到大选择边    {        int t1 = Find(EG[i].u), t2 = Find(EG[i].v);        if(t1 != t2)    //若不在同一棵树种则选择该边,合并两棵树        {            ans += EG[i].w;            parent[t1] = t2;        }    }}int main(){    while(~scanf("%d%d", &n,&m))    {        for(int i = 1; i <= m; i++)            scanf("%d%d%d", &EG[i].u, &EG[i].v, &EG[i].w);        Kruskal();        printf("%d\n", ans);    }    return 0;}

0 0
原创粉丝点击