首页 > 其他 > 详细

poj 3522 枚举+kruskal

时间:2014-08-16 21:08:41      阅读:392      评论:0      收藏:0      [点我收藏+]

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

poj 3522 枚举+kruskal

原文:http://blog.csdn.net/gg_gogoing/article/details/38616529

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!