C - Networking POJ - 1287 出现了Memory Limit Exceeded /Runtime Error

   出现了Memory Limit Exceeded /Runtime Error 可能是数组的大小引起的    ,当然还有其他原因,这里不给予说明。

题目如下:

   您被分配设计广泛区域中某些点之间的网络连接。您将获得该区域中的一组点,以及可连接成对点的电缆的一组可能路线。对于两点之间的每条可能路线,您将获得连接该路线上的点所需的电缆长度。请注意,在两个给定点之间可能存在许多可能的路径。假设给定的可能路线(直接或间接)连接该区域中的每两个点。 
您的任务是为该区域设计网络,以便在每两个点之间存在连接(直接或间接)(即,所有点都是互连的,但不一定是通过直接电缆),并且总长度为用过的电缆很少。

输入

    输入文件由许多数据集组成。每个数据集定义一个必需的网络。集合的第一行包含两个整数:第一行定义给定点的数量P,第二行定义点之间给定路径的数量R. 以下R行定义了点之间的给定路线,每条线给出三个整数:前两个数字标识点,第三个给出路线的长度。数字用空格分隔。仅给出一个数字P = 0的数据集表示输入的结束。数据集用空行分隔。 
最大点数为50.给定路线的最大长度为100.可能的路线数量不受限制。节点用1和P(含)之间的整数标识。两个点i和j之间的路线可以给出为ij或j i。 

产量

对于每个数据集,在单独的行上打印一个数字,该行显示用于整个设计网络的电缆的总长度。

样本输入

1 0

2 3
1 2 37
2 1 17
1 2 68

3 7
1 2 19
2 3 11
3 1 7
1 3 5
2 3 89
3 1 91
1 2 32

5 7
1 2 5
2 3 7
2 4 8
4 5 11
3 5 10
1 5 6
4 2 12

0

样本输出

0
17
16
26

代码如下:数组定义的大小会直接导致程序的成功或失败:

错误案例:

所以数组的大小要经过计算才能设定,切莫胡乱定义

最终代码如下:

#include <iostream>//通过//注意数组的大小范围 
#include <cstdio>
using namespace std;
const int INF=9999;

int a[2000][2000];
int b[2000];
int P,R,min;
void prim(int s)
{
	int k,i,j,ans=0,min;
	for(i=1;i<=P;i++)
		b[i] = a[s][i];
	
	b[s]=0;
	
	for(i=1;i<P;i++)
	{
		min = INF;
		for(j=1;j<=P;j++)
		if(b[j]!=0 && b[j]<min)
		{
			min = b[j];
			k = j;
		}
		b[k] = 0;
		ans += min;
		
		for(j=1;j<=P;j++)
		  if(a[k][j]<b[j])
			b[j] = a[k][j];
	}
	printf("%d\n",ans);
	return;
	
}
int main()
{
	while(scanf("%d",&P),P!=0)
	{
		scanf("%d",&R);
		for(int i=1;i<=R;i++){
			for(int j=1;j<=R;j++){
				a[i][j]=INF;
				b[i]=INF;
			}
		}
		for(int i=1;i<=R;i++)
		{
			int x1,y1,z1;
			scanf("%d %d %d",&x1,&y1,&z1);
			getchar();
			if(z1<a[x1][y1] || z1<a[y1][x1])
				a[x1][y1] = z1,a[y1][x1] = z1;
		}
		prim(1);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/orange1710/article/details/81220377