Kruskal最小生成树算法

来源:互联网 发布:淘宝长尾词是什么意思 编辑:程序博客网 时间:2024/06/04 19:33

Kruskal是通过一个贪心的想法:每次取剩下的边权最小的边,如果加上这条边以后图中出现了一个环(这个可以通过并查集维护),则破坏了生成树的性质,就不选这条边。依次进行直到整张图出现一棵生成树为止。

下面为Kruskal算法代码:

#include<iostream>#include<algorithm>#include<cstdio>using namespace std;const int maxn = 1001;int fa[maxn];int N,M;struct edge{    int x,y,w;    edge(int x = 0,int y = 0,int w = 0):x(x),y(y),w(w) {}}e[maxn];bool cmp(edge a,edge b){    return a.w < b.w;}int getfather(int x){    if(x == fa[x])    {        return x;    }    else    {        return fa[x] = getfather(fa[x]);    }}int kruskal(){    int ans;    sort(e+1,e+M+1,cmp);   //对边按从小到大排序    int cnt = N;    for(int i=1;i<=N;i++) fa[i] = i; //初始化并查集    for(int i=1;i<=M;i++)    {        int t1 = getfather(e[i].x);        int t2 = getfather(e[i].y);        if(t1 != t2)        {            fa[t1] = t2;            cnt--;            ans += e[i].w;            cout<<"edge1:"<<e[i].x<<" "<<"edge2:"<<e[i].y<<" "<<"ans:"<<ans<<endl;            if(cnt == 1) break; //若只剩一个连通块,即最小生成树已经得出,则退出        }    }    return ans;}int main(){    int answer;    freopen("111","r",stdin);    cin>>N>>M;    for(int i=1;i<=M;i++)    {        cin>>e[i].x>>e[i].y>>e[i].w;    }    answer = kruskal();    cout<<"minimal answer:"<<answer<<endl;    return 0;}

0 0
原创粉丝点击