num数组表示最短路径数量,w数组表示最短路径的最大救援队数量
欢迎留言讨论
#include <bits/stdc++.h>
using namespace std;
int n,m,d1,d2,a,b,c,num[510],w[510],ww[510],dis[510],pd[510],e[510][510];
int main()
{
scanf("%d %d %d %d",&n,&m,&d1,&d2);
for (int i=0;i<n;i++) scanf("%d",&ww[i]);
memset(e,0x3f,sizeof e);
memset(dis,0x3f,sizeof dis);
while (m--) {
scanf("%d %d %d",&a,&b,&c);
e[a][b]=min(e[a][b],c);
e[b][a]=min(e[b][a],c);
}
dis[d1]=0;
w[d1]=ww[d1];
num[d1]=1;
for (int i=0;i<n;i++) {
int t=-1;
for (int j=0;j<n;j++) if (!pd[j]&&(t==-1||dis[j]<dis[t])) t=j;
pd[t]=1;
for (int j=0;j<n;j++) {
if (dis[t]+e[t][j]<dis[j]) {
dis[j]=dis[t]+e[t][j];
num[j]=num[t];
w[j]=w[t]+ww[j];
} else if (dis[t]+e[t][j]==dis[j]) {
num[j]+=num[t];
if (w[t]+ww[j]>w[j]) w[j]=w[t]+ww[j];
}
}
}
printf("%d %d\n",num[d2],w[d2]);
return 0;
}