最小瓶颈树

http://poj.org/problem?id=3522
瓶颈生成树 无向图G的一颗瓶颈生成树是这样的一颗生成树,它最大的边权值在G的所有生成树中是最小的。瓶颈生成树的值为T中最大权值边的权。

#include<string.h>
#include<stdio.h>
#include<queue>
#include<algorithm>
#define Max(a,b) a>b?a:b
#define Min(a,b) a<b?a:b
using namespace std;
int father[110],grade[110],component;
struct Edge
{
    int u,v,w;
    bool operator <(const Edge& that) const
    {
        return w<that.w;
    }
}arr[4960];
int parent(int v)
{
    while(v!=father[v])
    {
        father[v]=father[father[v]];
        v=father[v];
    }
    return v;
}
int  connect(int a,int b)
{

    int fa=parent(a);
    int fb=parent(b);
    if(fa==fb) return 0;
    if(grade[fa]<grade[fb])
    {
        father[fb]=fa;
        grade[fa]+=grade[fb];

    }
    else
    {
        father[fa]=fb;
        grade[fb]+=grade[fa];
    }
    component--;
    return 1;

}
int main(){
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
            int len=0x3f3f3f3f;
            if((n==0)&&(m==0)) break;
            if(m==0)
            {
                printf("-1\n");
                continue;
            }
            for(int i=0;i<m;i++)
            {

                scanf("%d%d%d",&arr[i].u,&arr[i].v,&arr[i].w);
            }
            sort(arr,arr+m);
           // printf("Min:%d\n",len);
        for(int i=0;i<=m-n+1;i++)
        {
             memset(grade,-1,sizeof(grade));
            for(int i=1;i<=n;i++)
            father[i]=i;
            component=n;
            int lef=0x3f3f3f3f,rig=-1;
            for(int j=i;j<m;j++)
            {
                if(connect(arr[j].u,arr[j].v))
                {
                    lef=Min(lef,arr[j].w);
                    rig=Max(rig,arr[j].w);
                }
            }
            if(component==1)
            len=Min(len,rig-lef);
        }
        if(len==0x3f3f3f3f) printf("-1\n");
        else printf("%d\n",len);

    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容