图论 —— 最小生成树 —— 最小瓶颈生成树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011815404/article/details/89385097

【概述】

所谓瓶颈生成树,即对于图 G 中的生成树树上最大的边权值在所有生成树中最小

对于无向图来说,无向图的最小生成树一定是最小瓶颈生成树,但最小瓶颈生成树不一定是最小生成树。

因此,使用 Kruskal 算法即可求出无向图的最小瓶颈生成树。

【Kruskal】

struct Edge{
    int u,v,w;
    bool operator <(Edge K)const{
        return w<K.w;
    }
}edge[N];
int n,m;
int father[N],res;
int mst=0;
int Find(int x){
    if(father[x]==x)
        return x;
    return father[x]=Find(father[x]);
}
void kruskal(){
    for(int i=1;i<=n;++i)
      father[i]=i;
    sort(edge+1,edge+m+1);
    for(int i=1;i<=m;++i){
        int f1=Find(edge[i].u);
        int f2=Find(edge[i].v);
        if(f1==f2)
            continue;
        father[f2]=f1;
 
        mst++;
        if(mst==n-1){
            res=edge[i].w;
            return;
        }
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;++i)
      scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
    kruskal();
    printf("%d\n",res);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/u011815404/article/details/89385097