#include<cstdio>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn=1005;
const int inf=1000000000;
int n,m,c1,c2,maxi=-1,numb[maxn]={0};
int g[maxn][maxn],d[maxn],weight[maxn],w[maxn];
bool vis[maxn]={false};
void dijkstra(int s,int e){
fill(numb,numb+maxn,0);
fill(d,d+maxn,inf); d[s]=0;
fill(w,w+maxn,0); w[s]=weight[s];
numb[s]=1;
for(int i=0;i<n;i++){
int u=-1,min=inf;
for(int j=0;j<n;j++){
if(vis[j]==false && d[j]<min){
u=j;
min=d[j];
}
}
if(u==-1) return ;
vis[u]=true;
for(int i=0;i<n;i++){
if(vis[i]==false && g[i][u]!=inf){ //关键代码!!!!!!/******特别重要!!!
if(d[i]>d[u]+g[u][i]){
d[i]=d[u]+g[u][i];
g[i][u]=inf; //此句多余!!!因为不可能出现边的长度≤0的情况!!即不可能出现回退现象!!!!
w[i]=w[u]+weight[i]; //因为最短路径有优先权!!
numb[i]=numb[u];
} else if(d[i]==d[u]+g[u][i]){
if(w[i]<w[u]+weight[i]) {
w[i]=w[u]+weight[i];
}
numb[i]+=numb[u];
}
}
}
}
printf("%d %d\n",numb[e],w[e]);return ;
}
int main(){
fill(g[0],g[0]+maxn*maxn,inf);
scanf("%d%d%d%d",&n,&m,&c1,&c2);
for(int i=0;i<n;i++){
int ww;
scanf("%d",&ww);
weight[i]=ww;
}
for(int i=0;i<m;i++){
int cc1,cc2,l;
scanf("%d%d%d",&cc1,&cc2,&l);
g[cc1][cc2]=l;
g[cc2][cc1]=l;
}
dijkstra(c1,c2);
return 0;
}
A1003 Emergency(25)
最新推荐文章于 2021-01-26 20:51:58 发布