Jungle roads (zoj 1406 hdoj 1301)

#include<stdio.h>
int main()
{
	int n,map[27][27],dist[27];
	const int MAX = 10000000;
	while(scanf("%d",&n)&&n)
	{
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
			{
				if(i==j) map[i][j]=0;
				else map[i][j]= MAX;
			}
		for(int i=0;i<n-1;i++)
		{
			char a,b;
			int m,x;
			getchar();
			scanf("%c%d",&a,&m);
			while(m--)
			{
				getchar();
				scanf("%c%d",&b,&x);
				map[a-'A'][b-'A']=x;
				map[b-'A'][a-'A']=x;
			}
		}
		for(int i=0;i<n;i++)
		{
			dist[i]=map[0][i];
		}
		for(int i=0;i<n;i++)
		{
			int k=0;
			int min=100;
			for(int j=0;j<n;j++)
			{
				if(dist[j]>0&&dist[j]<min){
					min=dist[j];
					k=j;
				}
			}
			dist[k]=-dist[k];
			for(int j=0;j<n;j++)
			{
				if(dist[j]==MAX&&map[k][j]>0) dist[j]=map[k][j];
				else if(dist[j]>0&&map[k][j]>0&&map[k][j]<dist[j]) dist[j]=map[k][j];
			}
		}
		int sum=0;
		for(int i=0;i<n;i++)
		{
			sum-=dist[i];
		}
		printf("%d\n",sum);
	}
	return 0;
}


做完这题对zoj敬佩不已了。。。     用的prim算法,   表示本来偷懒将无法到达设置为-1   结果,因为二次偷懒将到达过得距离设置为负数(老师上课讲的时候这么做的,效果不错,省新创一个数组了。。。) 结果-1有可能和负数重复,  导致已经加进去的点,本来为-1的距离当作没有加进过的点进行二次的更改距离。。。   导致WA了。。。 贴代码

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值