最小瓶颈生成树:最大的边权值在G的所有生成树中是最小的。瓶颈生成树的值为T中最大权值边的权。无向图的最小生成树一定是瓶颈生成树,但瓶颈生成树不一定是最小生成树。
题意:求一颗生成树,满足最大边和最小边之差最小
思路分析:100个顶点,5000条边,用kruskal算法,暴力枚举从每条边开始构造最小生成树。
代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<cstring>
#include<string>
#define N 105
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 10e-6
using namespace std;
struct node
{
int x,y,w;
}s[N*N];
bool cmp(node a,node b)
{
return a.w < b.w;
}
int f[N];
int find(int x)
{
return x == f[x] ? x : f[x] = find(f[x]);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m) != EOF)
{
if(n == 0 && m == 0) break;
int i;
for(i = 0; i < m; i++)
scanf("%d%d%d",&s[i].x,&s[i].y,&s[i].w);
sort(s,s+m,cmp);
s[m].w = -1;
int ans = inf;
int start = 0,end;
while(start < m)
{
for(i = 0; i <= n; i++) f[i] = i;
int cnt = 0;
for(i = start; i < m; i++)
{
int xx = find(s[i].x);
int yy = find(s[i].y);
if(xx != yy)
{
cnt++;
f[xx] = yy;
}
if(cnt == n-1) break;
}
if(cnt == n-1) ans = min(ans,s[i].w - s[start].w);
else break;
while(s[start].w == s[start+1].w)
start++;
start++;
}
if(ans == inf) printf("-1\n");
else printf("%d\n",ans);
}
return 0;
}