http://poj.org/problem?id=3522
题意:
求 最大边和最小边的 差值 最小的 生成树 ;
首先求出 所有的 生成树 肯定 不行;
对于 最小生成树 有 这样的性质
当最小边的权值固定时,最小生成树的最大边的权值也“命中注定”是固定的;
而且 其他的生成树的最大边(最小边 固定 的 情况下)必然也是大于等于最小生成树的最大边;
所以 我们可以 枚举 最小边 ,求 最小生成树 ,更新 解;
1 #include<cstdio>
2 #include<cstring>
3 #include<cmath>
4 #include<iostream>
5 #include<algorithm>
6 #include<set>
7 #include<map>
8 #include<queue>
9 #include<vector>
10 #include<string>
11 #define Min(a,b) a<b?a:b
12 #define Max(a,b) a>b?a:b
13 #define CL(a,num) memset(a,num,sizeof(a));
14 #define eps 1e-12
15 #define inf 100000000
16
17
18 const double pi = acos(-1.0);
19 const int maxn = 110;
20 typedef __int64 ll;
21 using namespace std;
22
23 //freopen("data.txt","r",stdin);
24 struct node
25 {
26 int x;
27 int y;
28 int w;
29 }p[maxn*maxn] ;
30 int num ,mx,mi,n,m,f[maxn];
31 int cmp(node a,node b)
32 {
33 return a.w < b.w ;
34 }
35 int find(int x)
36 {
37 if(x != f[x]) f[x] = find(f[x]);
38 return f[x] ;
39 }
40 void init()
41 {
42 int i ;
43 for(i = 0 ; i <= n;i++)f[i] = i ;
44
45 num = 0 ;
46 mx = -inf ;
47 mi = inf ;
48
49 }
50 int solve()
51 {
52 int i ,j ;
53 int ans = inf ;
54 for(i = 0 ; i < m;i++)
55 {
56 init() ;
57 for(j = i ;j < m;j++)
58 {
59 int a = find(p[j].x) ;
60 int b = find(p[j].y);
61 if(a!=b)
62 {
63 f[a] = b;
64 num++;
65 if(mx < p[j].w )mx = p[j].w;
66 if(mi > p[j].w) mi = p[j].w ;
67
68 if(num == n - 1){break ;}
69 }
70
71 }
72
73 if(num == n-1)
74 {
75 if(ans > mx - mi) ans = mx - mi ;
76
77
78 if(ans == 0) return 0;
79 }
80 else return ans ;
81
82
83 }
84 return ans ;
85 }
86 int main()
87 {
88 //freopen("data.txt","r",stdin);
89 int i ;
90
91 while(scanf("%d%d",&n,&m),n+m)
92 {
93 for(i = 0 ;i < m;i++)
94 {
95 scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].w);
96
97 }
98 sort(p,p+m,cmp);
99
100 int ans = inf ;
101 ans = solve() ;
102 if(ans == inf)printf("-1\n");
103 else printf("%d\n",ans) ;
104
105 }
106 }
2 #include<cstring>
3 #include<cmath>
4 #include<iostream>
5 #include<algorithm>
6 #include<set>
7 #include<map>
8 #include<queue>
9 #include<vector>
10 #include<string>
11 #define Min(a,b) a<b?a:b
12 #define Max(a,b) a>b?a:b
13 #define CL(a,num) memset(a,num,sizeof(a));
14 #define eps 1e-12
15 #define inf 100000000
16
17
18 const double pi = acos(-1.0);
19 const int maxn = 110;
20 typedef __int64 ll;
21 using namespace std;
22
23 //freopen("data.txt","r",stdin);
24 struct node
25 {
26 int x;
27 int y;
28 int w;
29 }p[maxn*maxn] ;
30 int num ,mx,mi,n,m,f[maxn];
31 int cmp(node a,node b)
32 {
33 return a.w < b.w ;
34 }
35 int find(int x)
36 {
37 if(x != f[x]) f[x] = find(f[x]);
38 return f[x] ;
39 }
40 void init()
41 {
42 int i ;
43 for(i = 0 ; i <= n;i++)f[i] = i ;
44
45 num = 0 ;
46 mx = -inf ;
47 mi = inf ;
48
49 }
50 int solve()
51 {
52 int i ,j ;
53 int ans = inf ;
54 for(i = 0 ; i < m;i++)
55 {
56 init() ;
57 for(j = i ;j < m;j++)
58 {
59 int a = find(p[j].x) ;
60 int b = find(p[j].y);
61 if(a!=b)
62 {
63 f[a] = b;
64 num++;
65 if(mx < p[j].w )mx = p[j].w;
66 if(mi > p[j].w) mi = p[j].w ;
67
68 if(num == n - 1){break ;}
69 }
70
71 }
72
73 if(num == n-1)
74 {
75 if(ans > mx - mi) ans = mx - mi ;
76
77
78 if(ans == 0) return 0;
79 }
80 else return ans ;
81
82
83 }
84 return ans ;
85 }
86 int main()
87 {
88 //freopen("data.txt","r",stdin);
89 int i ;
90
91 while(scanf("%d%d",&n,&m),n+m)
92 {
93 for(i = 0 ;i < m;i++)
94 {
95 scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].w);
96
97 }
98 sort(p,p+m,cmp);
99
100 int ans = inf ;
101 ans = solve() ;
102 if(ans == inf)printf("-1\n");
103 else printf("%d\n",ans) ;
104
105 }
106 }