您的位置:首页 > 其它

最小生成树(苗条生成树 uva 1395)

2016-07-17 02:37 363 查看
#include<stdio.h>
#include<algorithm>
#define maxn 10010
#define INF 0X3F3F3F3F
using namespace std;

int u[maxn],v[maxn],w[maxn],p[maxn],r[maxn];
int n,m;

int cmp(const int i,const int j){return w[i]<w[j];}
int find(int x) {return p[x]==x?x:p[x]=find(p[x]);}

int main()
{
while(scanf("%d %d",&n,&m)==2&&(n||m))
{
for(int i=1;i<=m;i++)
{
r[i]=i;
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
u[i]=a;v[i]=b;w[i]=c;
}
sort(r+1,r+m+1,cmp);
int ANS=INF;
for(int i=1;i<=m;i++)
{
int MIN=INF,MAX=0;
int cnt=0;
for(int j=1;j<=m;j++) p[j]=j;
for(int j=i;j<=m;j++)
{
int e=r[j];int x=find(u[e]);int y=find(v[e]);
if(x!=y) {MIN=min(MIN,w[e]);MAX=max(MAX,w[e]);p[x]=y;cnt++;}
}
if(cnt==n-1) ANS=min(ANS,MAX-MIN);
}
if(ANS==INF) printf("-1\n");
else printf("%d\n",ANS);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  最小生成树