http://poj.org/problem?id=3522
题意:
题解:
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 111 , M = 10010;
struct Edge {
int u , v , w;
}edge[M];
int n , m , E , f[N] , ans;
void init() {
for(int i=0;i<=n;i++) f[i] = i;
}
int find(int x) {
return x == f[x] ? x : f[x] = find(f[x]);
}
void Union(int x,int y) {
int a = find(x) , b = find(y);
f[a] = f[b] = f[x] = f[y] = min(a , b);
}
bool cmp(Edge a , Edge b) {
return a.w < b.w;
}
bool kruskal(int s) {
int cnt = 0;
int w1 = edge[s].w , w2 = (1<<30)-1;
init();
for(int i=s;i<E;i++) {
int u = edge[i].u , v = edge[i].v;
if(find(u) == find(v)) continue;
Union(u , v);
cnt ++;
if(cnt == n-1) {
w2 = edge[i].w;
break;
}
}
if(cnt < n-1) return false;
if(w2 - w1 < ans) ans = w2 - w1;
return true;
}
int main() {
while(~scanf("%d%d",&n,&m) && n+m) {
E = m;
for(int i=0;i<m;i++) {
int u , v ,w;
scanf("%d%d%d",&u,&v,&w);
edge[i].u = u; edge[i].v = v; edge[i].w = w;
}
sort(edge , edge+E , cmp);
ans = (1<<29);
for(int i=0;i<m-n+2;i++) {
kruskal(i);
}
if(ans == (1<<29)) puts("-1");
else printf("%d\n" , ans);
}
return 0;
}