题意:
求一颗生成树,使得边权的最大值与最小值之差最小。如果不能生成树,输出-1。
思路:Kruskal+枚举最短的边。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct node
{
int from,to,weight;
}s[10005];
int first[10050],next[10050],f[1005],n,m,answer;
bool cmp(const node &a,const node &b)
{
return a.weight<b.weight;
}
int find(int x)
{
return f[x]==x?f[x]:f[x]=find(f[x]);
}
int Kruskal(int k)
{
int ans=0x3fffffff,cnt=0;
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=k;i<=m;i++)
{
int fx=find(s[i].from),fy=find(s[i].to);
if(fx!=fy)
{
f[fx]=fy;
ans=s[i].weight;
cnt++;
}
}
if(cnt==n-1)
return ans-s[k].weight;
return 0x3fffffff;
}
int main()
{
while(scanf("%d%d",&n,&m)&&(n||m))
{
answer=0x3fffffff;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&s[i].from,&s[i].to,&s[i].weight);
}
sort(s+1,s+1+m,cmp);
for(int i=1;i<=m;i++)
{
answer=min(Kruskal(i),answer);
}
if(answer==0x3fffffff)
printf("-1\n");
else printf("%d\n",answer);
}
}
很少见的一次AC。