PAT A1003 Emergency (25 分)
采用DFS:
#include#include for(int i=0;iusing namespace std; int N,M,C1,C2; int dis[500][500],mindis[500],num_of_team[500],paths,teams; vector<int>v[500]; void dfs(int curcity,int curlen,int curteam){ if(curlen>mindis[curcity])return; if(curcity==C2){ if(curlen==mindis[C2]){ paths++; if(curteam>teams)teams=curteam; } else{ paths=1; teams=curteam; mindis[C2]=curlen; } } else{ if(curlen curlen; ){ int j=v[curcity][i]; dfs(j,curlen+dis[curcity][j],curteam+num_of_team[j]); } } } int main(){ int i,j,k,l; cin>>N>>M>>C1>>C2; for(i=0;i ){ cin>>num_of_team[i]; } for(i=0;i ){ cin>>j>>k>>l; v[k].push_back(j); v[j].push_back(k); dis[j][k]=dis[k][j]=l; } fill(mindis,mindis+500,100000); dfs(C1,0,num_of_team[C1]); cout< " "<<teams; }
采用Dijkstra算法
#include#include int u=-1,MIN=INF; for(int j=0;jusing namespace std; const int INF=1000000; int dis[500][500],mindis[500],num_of_team[500],teams[500],paths[500];//从左至右依次代表,【两城市之间的距离】,【从起始城市到达某城市的最短距离】,【每一个城市的救援队】,【从起始点到达每个城市的最多救援队】,【最短路径的条数】 bool vis[500]={false};//标记是否已经找到最短路径 vector<int> v[500]; int N,M,C1,C2; void Dijkstra(int C1){ fill(mindis,mindis+500,INF); fill(teams,teams+500,0); mindis[C1]=0; teams[C1]=num_of_team[C1]; paths[C1]=1; for(int i=0;i ){ ){ if(vis[j]==false&&mindis[j]<MIN){ MIN=mindis[j]; u=j; } } if(u==-1) return; vis[u]=true; for(int i=0;i ){ int k=v[u][i]; if(vis[k]==false){ if(mindis[u]+dis[u][k]<mindis[k]) { mindis[k]=mindis[u]+dis[u][k]; paths[k]=paths[u]; teams[k]=teams[u]+num_of_team[k]; } else if(mindis[u]+dis[u][k]==mindis[k]){ paths[k]+=paths[u]; if(teams[u]+num_of_team[k]>teams[k]){ teams[k]=teams[u]+num_of_team[k]; } } } } } } int main(){ int i,j,k,l; cin>>N>>M>>C1>>C2; for(i=0;i ){ cin>>num_of_team[i]; } for(i=0;i ){ cin>>j>>k>>l; dis[j][k]=dis[k][j]=l; v[j].push_back(k); v[k].push_back(j); } Dijkstra(C1); cout< " "<<teams[C2]; }