最小生成树

Posted 2004-08-20

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小生成树相关的知识,希望对你有一定的参考价值。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1e5+10;
int fa[maxn];

struct Edge{
    int from;
    int to;
    int w;
}edge[maxn];

bool cmp(Edge a,Edge b){
    return a.w < b.w;
}

int find(int x){
    return (x == fa[x]) ? x : (fa[x] = find(fa[x]));
}//找到节点祖先并且压缩路径

void Merge(int x,int y){
    fa[find(x)] = find(y);
}//判断两个节点是否为同一个祖先

int tot;

void add(int x,int y,int z){
    edge[++tot].from = x;
    edge[tot].to = y;
    edge[tot].w = z;
}

int Solve(int n,int m){
    sort(edge+1,edge+1+m,cmp);
    int cnt = 0;
    int ans = 0;
    for(int i = 1;i <= m;++i){
        int x = edge[i].from,y = edge[i].to;
        if(find(x) != find(y)){
            Merge(x,y);
            ans += edge[i].w;
            if(++cnt == n - 1)return ans;//cnt 用来记录已经添加了的边的条数,最后跳出循环表示已经添加了n - 1条边,即树已经完成
        }
    }
    return -1;//找不到最小生成树,即图不联通
}

int main(){
    int n;
    scanf("%d",&n);
    for(int i = 1;i <= n;++i)fa[i] = i;
    for(int i = 1;i <= n;++i){
        for(int j = 1;j <= n;++j){
            int dis;
            scanf("%d",&dis);
            add(i,j,dis);
        }
    }
    int ans = Solve(n,n*n);
    printf("%d",ans);
    return 0;
}
//感到了最小生成树深深的恶意

以上是关于最小生成树的主要内容,如果未能解决你的问题,请参考以下文章

c语言最小生成树

图——最小生成树

最小生成树 求大神解救

图的最小生成树算法?

[LuoguP4208][JSOI2008]最小生成树计数(最小生成树+矩阵树定理)

最小生成树专题