1. 程式人生 > >緊急救援 L2-001

緊急救援 L2-001

復雜 ++ 就會 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