标签:
题意:
要求的是所有生成树中最大边与最小边差值最小的那个。
分析:
其实可以利用最小瓶颈生成树,就是最小生成树这一性质,枚举原图的最小边,然后找相应生成树的最大边
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=110;
const int INF=10000000000;
struct edge
{
int x,y;
int d;
bool operator <(const edge &a)const
{
return d<a.d;
}
}e[maxn*maxn];
int fa[maxn];
int n,m;
int maxt;
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int kruskal(int x)
{
maxt=-1;
int cnt=0;
int i;
for(i=0;i<=n;i++)
fa[i]=i;
for(i=x;i<m;i++)
{
int pa=e[i].x;
int pb=e[i].y;
int d=e[i].d;
int X=find(pa);
int Y=find(pb);
if(X!=Y)
{
fa[X]=Y;
maxt=max(d,maxt);
if(++cnt==n-1)
return 1;
}
}
return 0;
}
int main()
{
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
break;
int i;
for(i=0;i<m;i++)
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].d);
sort(e,e+m);
int ans=INF;
for(i=0;i<m;i++)
{
if(kruskal(i)==1)
{
ans=min(ans,maxt-e[i].d);
}
}
if(ans==INF)
printf