本文主要是介绍poj 3522 Slim Span,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目:http://poj.org/problem?id=3522
题意:求最大边与最小边差值最小的生成树
解题分析:
最小生成树有一个很重要的性质:在构造生成树时有可能选择不同的边,但最小生成树的权是唯一的!所以在用kruskal算法时第一次加入的必然是最小生成树的最小边权值,最小边确定后,最小生成树的最大边的权值是所以生成树中最小的,于是只要枚举最小边,然后求最小生成树,就可以得到最大边,只要每次更新最优解就行了。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf=99999999;
struct node
{
int x,y,w;
} t[10100];
int fa[105];
bool cmp(node a,node b)
{
return a.w<b.w;
}
int find(int x)
{
if(fa[x]==x)
return x;
return find(fa[x]);
}
int main()
{
int n,m,i,j,ans,temp;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
int min=inf;
for(i=0;i<m;i++)
scanf("%d%d%d",&t[i].x,&t[i].y,&t[i].w);
sort(t,t+m,cmp);
for(i=0;i<m;i++)
{
ans=0,temp=-1;
for(j=1;j<=n;j++) fa[j]=j;
for(j=i;j<m;j++)
{
if(find(t[j].x)!=find(t[j].y))
{
fa[find(t[j].x)]=find(t[j].y);
ans++;
if(ans==n-1)
{
temp=t[j].w-t[i].w;
break;
}
}
}
if(temp!=-1&&temp<min)
min=temp;
}
if(min<inf)
printf("%d\n",min);
else
printf("-1\n");
}
return 0;
}
这篇关于poj 3522 Slim Span的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!