过了样例就能AC
注意一点 0条边特意判断下。是否无法构成生成树也要判断
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define maxn 110
int parent[maxn];
int N,M;
struct edge
{
int u,v,w;
}edges[maxn*maxn];
int cmp(void const *a,void const *b)
{
return ((struct edge *)a)->w-((struct edge *)b)->w;
}
int find(int a)
{
if(parent[a]==-1)
return a;
return find(parent[a]);
}
int krusal()
{
int i,j,k,m,n;
int ans,tmp;
qsort(edges,M,sizeof(edges[0]),cmp);
ans=0x3fffffff;
if(M==0)
return -1;
for(i=0;i<M;i++)
{
memset(parent,-1,sizeof(parent));
k=0;j=i;
while(k<N-1 && j<M)
{
m=find(edges[j].u);
n=find(edges[j].v);
if(m!=n)
{
parent[find(m)]=find(n);
k++;//判断是否已经满足生成树,即已经有N个点了
}
j++;
}
if(i==0 && k<N-1)
return -1;
if(k<N-1)
continue;
tmp=edges[j-1].w-edges[i].w;
ans=ans<tmp?ans:tmp;
}
return ans;
}
int main()
{
int i;
while(scanf("%d%d",&N,&M),M+N)
{
for(i=0;i<M;i++)
scanf("%d%d%d",&edges[i].u,&edges[i].v,&edges[i].w);
printf("%d\n",krusal());
}
return 0;
}poj 3522 枚举+kruskal,布布扣,bubuko.com
原文地址:http://blog.csdn.net/gg_gogoing/article/details/38616529