首页 > 代码库 > poj 3522 枚举+kruskal

poj 3522 枚举+kruskal

过了样例就能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;
}