题意:
给出一个n个结点的无向图,找一棵苗条度(最大边减去最小边)最小的生成树。图中不含重边和自环。
题解:
首先对边的权值大小排序,从小到大开始枚举最小生成树。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 102;
const int M = N*(N-1)/2;
const int INF = 10005;
struct aha{
int u,v,w;
}a[M];
int p[N];
int cnt;
bool cmp(aha x,aha y){
return x.w < y.w;
}
void init(int n){
for(int i = 1; i < n+1; i++)
p[i] = i;
cnt = 0;
}
int find(int x){
int res;
if(p[x] == x) res = x;
else res = find(p[x]);
return res;
}
int main(){
int n,m;
int u,v,w,x,y;
while(~scanf("%d %d",&n,&m) && (m != 0 || n != 0)){
for(int i = 0; i < m; i++){
scanf("%d %d %d",&u,&v,&w);
a[i].u = u;
a[i].v = v;
a[i].w = w;
}
sort(a,a+m,cmp);
int res = INF;
for(int i = 0; i < m; i++){
//实际上可以改进 i<m-n+1 可查找的边不足n-1条了,当然不可能连通
init(n);
for(int j = i; j < m; j++){
x = a[j].u;
y = a[j].v;
int x_root = find(x);
int y_root = find(y);
if(x_root != y_root){
cnt++;
p[y_root] = x_root;
if(cnt == n-1){
res = min(res,a[j].w - a[i].w);
break;
}
}
}
}
if(res == INF) res = -1;
printf("%d\n",res);
}
}