POJ 3522 Slim Span

题目链接http://poj.org/problem?id=3522

kruskal+并查集,注意特殊情况比如1,0 、0,1、1,1

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm> 
 4 #include<climits>
 5 using namespace std;
 6 #define MAXN 5005
 7 struct edge{
 8     int u,v,cost;
 9 };
10 int comp(const edge& e1,const edge& e2){
11     return e1.cost<e2.cost;
12 }
13 edge es[MAXN];
14 int V,E;
15 int par[MAXN],rank[MAXN];
16 void init(){
17     for(int i=1;i<=V;i++){
18     par[i]=i;
19     }
20 } 
21 int find(int x){
22 if(par[x]==x)return x;
23 return par[x]=find(par[x]);    
24 }
25 void unite(int x,int y){
26     x=find(x);
27     y=find(y);
28     if(x!=y){
29     par[x]=y;
30     }
31 }
32 bool same(int x,int y){
33     return find(x)==find(y);
34 }
35 int kruskal(int k){
36     init();
37     int min,max=-1;
38     int esum=0;
39     for(int i=k;i<E;i++){
40         if(E-k<V-1)break;
41         edge e=es[i];
42         if(!same(e.u,e.v)){
43             unite(e.u,e.v);
44             esum++;
45             max=max<e.cost?e.cost:max;
46         }
47         if(esum==V-1){
48             min=es[k].cost;
49             return max-min;
50         }
51     }
52     return -1;
53 }
54 int main()
55 {
56     int i,flag=0;
57     while(scanf("%d%d",&V,&E)==2){
58     if(V==0&&E==0)break;
59     for(i=0;i<E;i++){
60     scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].cost);
61     }
62     if(E==0||V>100||E<V-1){
63     printf("-1\n");continue;}
64     sort(es,es+E,comp);
65     int min=INT_MAX,x;
66     for(i=0;i<E-V+2;i++){
67        x=kruskal(i);
68        if(min>x&&x!=-1){
69        min=x;
70        }
71     }
72     if(min!=INT_MAX)
73     printf("%d\n",min);
74     else
75     printf("-1\n");
76     }
77     return 0;
78 }

 

posted @ 2015-04-02 16:26  walkthehorizon  阅读(215)  评论(0编辑  收藏  举报