PAT A1003 Emergency (25 分)


采用DFS:

#include
#include
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(curlencurlen;
        for(int i=0;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){
        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
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){
       int u=-1,MIN=INF;
       for(int j=0;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){
             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];
}