PAT甲级1003

这里遇到了一个大坑,在定义数组的时候不能定义为500,会无法通过后四个测试点,甚至定义为501都可以,目前还没想明白为什么

#include<iostream>
#include<algorithm>
using namespace std;
const int INF=999999999;
bool visit[501]= {false};
int d[501];
int w[501];
int r[501];
int num[501];
int l[501][501];
int main() {
	int n,m,c1,c2,i,j;
	fill(l[0],l[0]+501*501,INF);
	scanf("%d%d%d%d",&n,&m,&c1,&c2);
	for(i=0; i<n; i++)
		scanf("%d",&r[i]);
	for(i=0; i<m; i++) {
		int a,b,c;
		scanf("%d%d%d",&a,&b,&c);
		if(c<l[a][b]) {
			l[a][b]=c;
			l[b][a]=c;
		}
	}
	fill(d,d+501,INF);
	d[c1]=0;
	w[c1]=r[c1];
	num[c1]=1;
	for(i=0; i<n; i++) {
		int min=INF;
		int u=-1;
		for(j=0; j<n; j++)
			if(!visit[j]&&d[j]<min) {
				u=j;
				min=d[j];
			}
		if(u==-1)
			break;
		visit[u]=true;
		for(j=0; j<n; j++)
			if(!visit[j]&&l[u][j]!=INF) {
				if(d[u]+l[u][j]<d[j]) {
					d[j]=d[u]+l[u][j];
					w[j]=w[u]+r[j];
					num[j]=num[u];
				} else if(d[u]+l[u][j]==d[j]) {
					num[j]+=num[u];
					if(w[u]+r[j]>w[j])
						w[j]=w[u]+r[j];
				}
			}
	}
	printf("%d %d",num[c2],w[c2]);
	return 0;
}

发布了26 篇原创文章 · 获赞 1 · 访问量 800

猜你喜欢

转载自blog.csdn.net/qq_43654994/article/details/105279660
今日推荐