较为复杂的dijkstra
包含路径打印 最小路的条数 最小路径的情况下取最大权值
v0要是标记就会出错。。。?
有权值的题目 不能设置mp[i][i]为0 否则会无限加权
这题很有参考价值 可以当模板
#include<bits/stdc++.h> using namespace std; #define N 510 #define INF 0x3f3f3f3f int n,e,s; int vis[N]; int dis[N]; int peo[N]; int mp[N][N]; int path[N]; int num[N]; int helpmen[N]; void dijkstra(int ) { memset(vis,0,sizeof(vis)); memset(path,0,sizeof(path)); memset(helpmen,0,sizeof(helpmen)); memset(num,0,sizeof(num)); for(int i=0;i<n;i++) dis[i]=mp[s][i]; dis[s]=0; // vis[s]=1; path[s]=-1; helpmen[s]=peo[s]; num[s]=1; for(int i=0;i<n;i++) { int minn=INF,u=-1; for(int j=0;j<n;j++) { if(!vis[j]&&dis[j]<minn) { minn=dis[j]; u=j; } } if(u==-1)return ; vis[u]=1; for(int j=0;j<n;j++) { if(dis[j]>dis[u]+mp[u][j]) { dis[j]=dis[u]+mp[u][j]; path[j]=u; helpmen[j]=peo[j]+helpmen[u]; num[j]=num[u]; } else if(dis[j]==dis[u]+mp[u][j]) { num[j]+= num[u]; if( helpmen[j]<helpmen[u]+peo[j] ) { helpmen[j]=helpmen[u]+peo[j]; path[j]=u; } } } } } void print(int x) { if(path[x]==-1) { printf("%d",x);return ; } print(path[x]); printf(" %d",x); return ; } int main() { int q,s; scanf("%d%d%d%d",&n,&q,&s,&e); for(int i=0;i<n;i++)scanf("%d",&peo[i]); memset(mp,INF,sizeof(mp)); // for(int i=0;i<n;i++)mp[i][i]=0;//如果加上这句话 就可在一个城市不断刷救援人员 while(q--) { int a,b,c; scanf("%d%d%d",&a,&b,&c); mp[a][b]=mp[b][a]=c; } dijkstra(s); printf("%d %d\n",num[e],helpmen[e]); print(e); return 0; }
原文:https://www.cnblogs.com/bxd123/p/10369166.html