首页 > 代码库 > 【最小瓶颈生成树】【最小生成树】【kruscal】bzoj1083 [SCOI2005]繁忙的都市

【最小瓶颈生成树】【最小生成树】【kruscal】bzoj1083 [SCOI2005]繁忙的都市

本意是求最小瓶颈生成树,但是我们可以证明:最小生成树也是最小瓶颈生成树(其实我不会)。数据范围很小,暴力kruscal即可。

 1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 struct Edge{int u,v,w;void Read(){scanf("%d%d%d",&u,&v,&w);}}edges[10001]; 5 bool operator < (const Edge &a,const Edge &b){return a.w<b.w;} 6 int n,m,fa[301],rank[301],tot; 7 void init(){for(int i=1;i<=n;i++)fa[i]=i;} 8 int findroot(int x) 9 {10     if(x==fa[x]) return x;11     int rt=findroot(fa[x]);12     fa[x]=rt;13     return rt;14 }15 void Union(const int &U,const int &V)16 {17     if(rank[V]<rank[U]) fa[V]=U;18     else19       {20           fa[U]=V;21           if(rank[U]==rank[V]) ++rank[U];22       }23 }24 int main()25 {26     scanf("%d%d",&n,&m); init();27     for(int i=1;i<=m;++i) edges[i].Read();28     sort(edges+1,edges+m+1);29     for(int i=1;i<=m;i++)30       {31           int f1=findroot(edges[i].u),f2=findroot(edges[i].v);32           if(f1!=f2)33             {34                 Union(f1,f2);35                 tot++;36                 if(tot==n-1)37                   {38                       printf("%d %d\n",n-1,edges[i].w);39                       return 0;40                   }41             }42       }43     return 0;44 }

【最小瓶颈生成树】【最小生成树】【kruscal】bzoj1083 [SCOI2005]繁忙的都市