poj-1251

    可怜啊,自己好不容易找了个prim的模板,然后花费不菲的时间使用printf(),scanf()来处理这么复杂的数字,字母的问题居然调试通过了,虽然在最后提交时报告了超时,参考了一下网上的代码,无非就是使用了很多的输入输出语句,这可能导致了大量的用时,算法代码是一致的. 先上正确的
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 10000
#define MAX 50
#define MAXN 100
int n,m,v,sum;
int edge[MAX][MAX];
int lowcost[MAX];
int nextvex[MAX];
int prim(int u0,int n)
{
	int i,j;
	int sum=0;
	for(i=1;i<=n;i++)//初始化lowcost[i],nextvex[i]
	{
		lowcost[i]=edge[u0][i];
		nextvex[i]=u0;
	}
	nextvex[u0]=-1;
	for(i=1;i<n;i++)
	{
		int min=INF;
		int v=-1;
		for(j=1;j<=n;j++)
			if(nextvex[j]!=-1 && lowcost[j]<min)//在lowcost[]数组(nextvex[]
												//值为1中找最小值)
		{

			v=j;min=lowcost[j];
//			printf("lowcost[i]=%d\n",lowcost[i]);
		}
		if(v!=-1)
		{
			nextvex[v]=-1;
			sum+=lowcost[v];
			for(j=1;j<=n;j++)
			{
				if(nextvex[j]!=-1 && edge[v][j]<lowcost[j])
				{
					lowcost[j]=edge[v][j];
					nextvex[j]=v;
				}
			}
		}
	}
	return sum;

}
int main()
{
//	freopen("jungle.in","r",stdin);
	int i,j;//循环变量
	char a,e,w;//a是每行的首字母,e是与a相连的字母,w是消除换行符的无用字符
	int n,k,cost;//n个城市,每个城市的k条道路,每条道路的权值cost
	while(cin>>n&&n){
	
	memset(edge,0,sizeof(edge));
	for(i=n;i>1;i--)
	{
		char a,e;
		int k;
		cin>>a>>k;
		for(j=1;j<=k;j++)

		{
			int cost;
			cin>>e>>cost;
			edge[a-64][e-64]=edge[e-64][a-64]=cost;

		}

	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(i==j)
				edge[i][j]=0;
			else if(edge[i][j]==0)
				edge[i][j]=INF;
		}
	}
	printf("%d\n",prim(1,n));

	}
	return 0;
}
下面是我自己写的 代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 10000
#define MAX 50
#define MAXN 100
int n,m,v,sum;
int edge[MAX][MAX];
int lowcost[MAX];
int nextvex[MAX];
int prim(int u0,int n)
{
	int i,j;
	int sum=0;
	for(i=1;i<=n;i++)//初始化lowcost[i],nextvex[i]
	{
		lowcost[i]=edge[u0][i];
		nextvex[i]=u0;
	}
	nextvex[u0]=-1;
	for(i=1;i<n;i++)
	{
		int min=INF;
		int v=-1;
		for(j=1;j<=n;j++)
			if(nextvex[j]!=-1 && lowcost[j]<min)//在lowcost[]数组(nextvex[]
												//值为1中找最小值)
		{

			v=j;min=lowcost[j];
//			printf("lowcost[i]=%d\n",lowcost[i]);
		}
		if(v!=-1)
		{
			nextvex[v]=-1;
			sum+=lowcost[v];
			for(j=1;j<=n;j++)
			{
				if(nextvex[j]!=-1 && edge[v][j]<lowcost[j])
				{
					lowcost[j]=edge[v][j];
					nextvex[j]=v;
				}
			}
		}
	}
	return sum;

}
int main()
{
	//freopen("jungle.in","r",stdin);
	int i,j;//循环变量
	char a,e,w;//a是每行的首字母,e是与a相连的字母,w是消除换行符的无用字符
	int n,k,cost;//n个城市,每个城市的k条道路,每条道路的权值cost
	while(1){
	scanf("%d",&n);//城市数目n
	if(n==0)
		break;
	scanf("%c",&w);//去除换行符的影响
	
	memset(edge,0,sizeof(edge));
	for(i=n;i>1;i--)
	{
		scanf("%c",&a);//城市A
		scanf("%c",&w);//消除换行符
		scanf("%d",&k);//与其他城市连接的道路数目
		for(j=1;j<=k;j++)

		{
			scanf("%c",&w);//消除影响
			scanf("%c",&e);//后一个城市
			scanf("%d",&cost);//权值
			edge[a-64][e-64]=edge[e-64][a-64]=cost;

		}
		scanf("%c",&w);//消除影响

	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			if(i==j)
				edge[i][j]=0;
			else if(edge[i][j]==0)
				edge[i][j]=INF;
		}
	}
	printf("%d\n",prim(1,n));

	}
	return 0;
}
二者区别仅在于输入输出的不同,教训:不管什么样的题,先做正确再说别的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值