poj 3522(生成树)

题意:求解一个图中生成树最大边与最小边的最小差值

思路:循环去掉小边求残图的最小生成树,求得最小生成树的最长边与最短边的最小差值就是答案,容易证明与最小边差值最小的生成树最大边必然在最小生成树中。

View Code
 1 #include
 2 #include
 3 #include<string.h>
 4 #include
 5 using namespace std;
 6 #define inf 0x3f3f3f3f
 7 #define N 110
 8 #define M N*N
 9 struct edge{
10     int a,b,w;
11 }e[M];
12 int f[N];
13 int comp(const void *a,const void *b)
14 {
15     return ((edge *)a)->w>((edge *)b)->w?1:-1;
16 }
17 int find(int x)
18 {
19     if(f[x]==x||f[x]==0)return x;
20     f[x]=find(f[x]);
21     return f[x];
22 }
23 int main()
24 {
25     int n,m;
26     while(scanf("%d%d",&n,&m))
27     {
28         int min0=inf;
29         if(n==0&&m==0)break;
30         for(int i=0;i)
31         scanf("%d%d%d",&e[i].a,&e[i].b,&e[i].w);
32         qsort(e,m,sizeof(edge),comp);
33         for(int i=0;i<=m-n+1;i++)
34         {
35             int c=0;
36             memset(f,0,sizeof(f));
37             for(int j=i;j)
38             {
39                 int a0=find(e[j].a);
40                 int b0=find(e[j].b);
41                 if(a0==b0)continue;
42                 else {
43                     f[a0]=b0;
44                     c++;
45                     if(c==n-1){min0=min(min0,e[j].w-e[i].w);break;}
46                 }
47             }
48             if(c1)break;
49         }
50         if(min0"%d\n",min0);
51         else printf("-1\n");
52     }
53     return 0;
54 }
55 
56 关闭提示 关闭
57 确 认 取 消

 

转载于:https://www.cnblogs.com/huangriq/archive/2012/05/12/2497657.html

你可能感兴趣的:(poj 3522(生成树))