救援
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<queue> #include<string.h> #include<algorithm> using namespace std; const int maxn=1007; const int INF=0x3f3f3f3f; int maps[maxn][maxn], dist[maxn], vis[maxn]; int path[maxn], pathnum[maxn], total[maxn], val[maxn], re[maxn]; int n, m, s, d; ///path[maxn]储存走当前城市的前一个城市 void init() { memset(vis, 0, sizeof(vis)); memset(dist, INF, sizeof(dist)); for(int i=0; i<=n; i++) { for(int j=0; j<=n; j++) maps[i][j]=INF; } } void dij(int a) { vis[a]=1; dist[a]=0; pathnum[a]=1; total[a]=val[a]; for(int i=0; i<n; i++) { if(maps[a][i]!=INF&&a!=i) { dist[i]=maps[a][i]; pathnum[i]=1; path[i]=a; total[i]=val[a]+val[i]; } } for(int i=0; i<n-1; i++) { int Min=INF, index; for(int j=0; j<n; j++) { if(!vis[j]&&dist[j]<Min) { Min=dist[j]; index=j; } } vis[index]=1; for(int j=0; j<n; j++) { if(!vis[j]) { if(dist[j]>Min+maps[index][j]) { dist[j]=Min+maps[index][j]; path[j]=index; pathnum[j]=pathnum[index]; total[j]=val[j]+total[index]; } else if(dist[j]==Min+maps[index][j]) { pathnum[j]+=pathnum[index]; if(total[j]<val[j]+total[index]) { total[j]=val[j]+total[index]; path[j]=index;///最终只走最短并且救援队数量最多的那条路那条路,所以要把这句放里面 } } } } } } int main() { while(~scanf("%d %d %d %d", &n, &m, &s, &d)) { int u, v, w; init(); for(int i=0; i<n; i++) scanf("%d", &val[i]); for(int i=0; i<m; i++) { scanf("%d %d %d", &u, &v, &w); maps[u][v]=maps[v][u]=min(maps[u][v], w); } dij(s); int num=0, cur=d; while(cur!=s) { re[num++]=cur; cur=path[cur]; } re[num++]=s; printf("%d %d\n", pathnum[d], total[d]); for(int i=num-1; i>0; i--) printf("%d ", re[i]); printf("%d\n", re[0]); } return 0; }