Emergency

mac2022-06-30  41

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=510; const int inf=1000000000; int n,m,G[maxn][maxn],weight[maxn]; int d[maxn],num[maxn],w[maxn]; bool vis[maxn]={false}; void Dijkstra(int s){ fill(d,d+maxn,inf); memset(num,0,sizeof(num)); memset(w,0,sizeof(w)); d[s]=0; num[s]=1; w[s]=weight[s]; 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 v=0;v<n;v++){ if(vis[v]==false&&G[u][v]!=inf){ if(d[u]+G[u][v]<d[v]){ d[v]=d[u]+G[u][v]; w[v]=w[u]+weight[v]; num[v]=num[u]; } else if(d[u]+G[u][v]==d[v]){ // 这里不加 else 就错了 //注意每次这两个情况只能出现一次,是互斥事件 num[v]+=num[u]; if(w[u]+weight[v]>w[v]){ w[v]=w[u]+weight[v]; } } } } } } int main(){ int st,ed,u,v; scanf("%d%d%d%d",&n,&m,&st,&ed); for(int i=0;i<n;i++){ scanf("%d",&weight[i]); } fill(G[0],G[0]+maxn*maxn,inf); for(int i=0;i<m;i++){ scanf("%d%d",&u,&v); scanf("%d",&G[u][v]); G[v][u]=G[u][v]; } Dijkstra(st); printf("%d %d\n",num[ed],w[ed]); }

 

最新回复(0)