PAT A1003 Emergency (25 分)
采用DFS:
#include<iostream>
#include<vector>
using 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<mindis[curcity])mindis[curcity]=curlen;
for(int i=0;i<v[curcity].size();i++){
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<N;i++){
cin>>num_of_team[i];
}
for(i=0;i<M;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<<paths<<" "<<teams;
}
采用Dijkstra算法
#include<vector>
#include<iostream>
using 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<N;i++){
int u=-1,MIN=INF;
for(int j=0;j<N;j++){
if(vis[j]==false&&mindis[j]<MIN){
MIN=mindis[j];
u=j;
}
}
if(u==-1) return;
vis[u]=true;
for(int i=0;i<v[u].size();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<N;i++){
cin>>num_of_team[i];
}
for(i=0;i<M;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<<paths[C2]<<" "<<teams[C2];
}

浙公网安备 33010602011771号