标签:
题目链接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 }
标签:
原文地址:http://www.cnblogs.com/walkthehorizon/p/4387344.html