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 }

 

你可能感兴趣的:(span)