这里遇到了一个大坑,在定义数组的时候不能定义为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;
}