码迷,mamicode.com
首页 > 其他好文 > 详细

【kruscal】【最小生成树】poj3522 Slim Span

时间:2014-10-11 17:29:55      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   ar   for   数据   sp   div   

求一个生成树,使得最大边权和最小边权之差最小。由于数据太小,暴力枚举下界,求出相应的上界。最后取min即可。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 int n,m,fa[101],rank[101];
 6 void clear(){for(int i=1;i<=n;i++) fa[i]=i; memset(rank,0,sizeof(rank));}
 7 int findroot(int x) 
 8 {
 9     if(fa[x]==x) return x;
10     int rt=findroot(fa[x]);
11     fa[x]=rt;
12     return rt;
13 }
14 void Union(int U,int V)
15 {
16     if(rank[U]<rank[V]) fa[U]=V;
17     else
18       {
19         fa[V]=U;
20         if(rank[U]==rank[V]) rank[U]++;
21       }
22 }
23 struct Edge{int u,v,w;};
24 bool cmp(const Edge &a,const Edge &b){return a.w<b.w;}
25 Edge edges[5001];
26 int tot,ans,maxv;
27 int main()
28 {
29     while(1)
30       {
31           scanf("%d%d",&n,&m);
32           if(!n) break;
33           for(int i=1;i<=m;i++) scanf("%d%d%d",&edges[i].u,&edges[i].v,&edges[i].w);
34           sort(edges+1,edges+m+1,cmp); ans=2147483647;
35           for(int j=1;j<=m;j++)
36             {
37                 tot=0; clear();
38                 for(int i=j;i<=m;i++)
39                 {
40                     int f1=findroot(edges[i].u),f2=findroot(edges[i].v);
41                     if(f1!=f2) {Union(f1,f2); tot++; if(tot==n-1) {maxv=edges[i].w; goto WIN;}}
42                 }
43               continue;
44               WIN:ans=min(ans,maxv-edges[j].w);
45             }
46           printf("%d\n",ans!=2147483647 ? ans : -1);
47       }
48     return 0;
49 }

 

【kruscal】【最小生成树】poj3522 Slim Span

标签:style   blog   color   io   ar   for   数据   sp   div   

原文地址:http://www.cnblogs.com/autsky-jadek/p/4019223.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!