poj 1251Jungle Roads (最小生成树:prime+krusual)

点击打开链接

krusual:

#include"stdio.h"
#include"stdlib.h"
int set[101];
struct node
{
	int a,b,dis;
}aa[101];
int find(int x)
{
	int r,i;
	r=x;
	while(set[r]!=r)
		r=set[r];
	while(set[x]!=r)
	{
		i=set[r];
		set[x]=r;
		r=i;
	}
	return r;
}
int cmp(const void*a,const void*b)
{
	struct node *c,*d;
	c=(struct node*)a;
	d=(struct node*)b;
	return c->dis-d->dis;
}
int main()
{
	int n,i,j,k,ans,cnt;
	int x,y,t,tt,ttt;
	char c,cc,str[100];
	while(scanf("%d",&n)!=EOF&&n)
	{
		for(i=0;i<=100;i++)
			set[i]=i;
		k=0;
		for(i=0;i<n-1;i++)
		{	
			scanf(" %c %d",&c,&t);
			for(j=0;j<t;j++)
			{
				scanf(" %c %d",&cc,&tt);
				aa[k].a=c-'A';
				aa[k].b=cc-'A';
				aa[k++].dis=tt;
			}
		}
		qsort(aa,k,sizeof(aa[0]),cmp);
		ans=0;cnt=0;
		for(i=0;i<k;i++)
		{
			x=find(aa[i].a);
			y=find(aa[i].b);
			if(x!=y)
			{
				ans+=aa[i].dis;
				set[x]=y;
				if(++cnt==n-1)break;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}
prime

#include"stdio.h"
#include"string.h"
#define INF 9999999
int map[30][30],mark[30],f[30];
int n;
void prime()
{
	int i,j,k,min,ans;
	memset(mark,0,sizeof(mark));
	for(i=0;i<n;i++)
		f[i]=map[0][i];
	f[0]=0;mark[0]=1;
	ans=0;
	/*prime算法只与边的个数有关,因为n个点有n-1个边,
	所以,循环进行n-1次,否则就会把定义的INF也加入最小生成树*/
	for(i=0;i<n-1;i++)
	{
		min=INF;
		for(j=0;j<n;j++)
		{
			if(!mark[j]&&f[j]<min)
			{
				min=f[j];k=j;
			}
		}
		ans=ans+min;
		mark[k]=1;
		for(j=0;j<n;j++)
		{
			if(!mark[j]&&f[j]>map[k][j])
				f[j]=map[k][j];
		}
	}
	printf("%d\n",ans);
}
int main()
{
	int i,j,t,tt;
	char c,cc;
	while(scanf("%d",&n)!=-1&&n)
	{
		memset(map,76,sizeof(map));
		for(i=0;i<n-1;i++)
		{
			scanf(" %c %d",&c,&t);
			for(j=0;j<t;j++)
			{
				scanf(" %c %d",&cc,&tt);
				map[c-'A'][cc-'A']=map[cc-'A'][c-'A']=tt;
			}
		}
		prime();
	}
	return 0;
}


posted on 2012-07-31 07:59  Slege  阅读(87)  评论(0编辑  收藏  举报

导航