[PAT]-L2-001 紧急救援 (25 分)-dijkstra

L2-001.png

分析

这是一道dijkstra的变式题,在求最短路径的基础上,求获得的最大救援数量
写的时候的主要坑点就在于计算有多少条最佳路径。

if(dis[v]>dis[u]+map[u][v]){
  roadnum[v]=roadnum[u];
}
else if(dis[v]==dis[u]+map[u][v]){
  roadnum[v]+=roadnum[u];
}

AC代码

#include<iostream>
#include<vector>
using namespace std;
#define maxn 500
#define inf 0x3f3f3f3f
int n,m,st,ed;

int map[maxn][maxn];
int dis[maxn];
int book[maxn];
int Maxteam[maxn];
int team[maxn];
int pre[maxn];
int roadnum[maxn];

void printPath(int v){
    if(v==st){
        cout<<v;
        return;
    }
    printPath(pre[v]);
    cout<<" "<<v;
}


void dijkstra(int x){
    for(int i=0;i<n;i++){
        dis[i]=inf;
        Maxteam[i]=inf;
    }
    dis[x]=0;
    Maxteam[x]=team[x];
    roadnum[x]=1;
    
    for(int i=0;i<n;i++){
        int min=inf,u=-1;
        for(int j=0;j<n;j++){
            if(book[j]==0 && min>dis[j]){
                min=dis[j];
                u=j;
            }
        }
        if(u==-1) break;
        book[u]=1;
        for(int v=0;v<n;v++){
            if(book[v]==0 && map[u][v]<inf ){
                if(dis[v]>dis[u]+map[u][v]){
                    dis[v]=dis[u]+map[u][v];
                    pre[v]=u;
                    roadnum[v]=roadnum[u];
                    Maxteam[v]=Maxteam[u]+team[v];
                    
                }else if(dis[v]==dis[u]+map[u][v]){
                    roadnum[v]+=roadnum[u];
                    if(Maxteam[v]<Maxteam[u]+team[v]){
                        Maxteam[v]=Maxteam[u]+team[v];
                        pre[v]=u;
                    }
                }
            }
        }
    }
}

int main(){
    cin>>n>>m>>st>>ed;
    
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(i==j){
                map[i][j]=0;
            }else{
                map[i][j]=inf;
            }
        }
    }

    
    for(int i=0;i<n;i++){
        cin>>team[i];
    }
    for(int i=0;i<m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        map[a][b]=map[b][a]=c;
    }
    dijkstra(st);
    cout<<roadnum[ed]<<" "<<Maxteam[ed]<<endl;
    printPath(ed);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 上海这春天,春装,很尴尬地存在! 刚脱下羽绒服没几日,稍厚的针织衫、薄款大衣外套才上身没几天,就热得人不耐烦地脱去...
    墨语花开时阅读 1,202评论 1 2
  • 看我横行能霸道,高悬二指铁钳拳。 牺牲为有多奇志,美味长留醉八仙。
    彼得瓦尔阅读 3,599评论 0 4
  • 雁飞高兮鸟难寻,空断肠兮哭莺莺
    一日蜉蝣君阅读 1,293评论 6 1
  • 文/袁非 依水而上 寻找的是水 也不是水 湘江源头 也不叫江 叫天犬岭 紧靠九嶷山南侧 竹林云海遮盖着湘江古老的秘...
    袁非非也阅读 4,274评论 4 24