緊急救援 L2-001
阿新 • • 發佈:2019-02-13
復雜 ++ 就會 bsp c++ sizeof 如果 人員 bits
較為復雜的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; }
緊急救援 L2-001