(PAT)1003. Emergency (25)

来源:互联网 发布:薛杉杉同款毛衣淘宝 编辑:程序博客网 时间:2024/05/17 00:53
#include<stdio.h>#include<string.h>#define INF 1<<10int n,m,so,ta;int cities[500+10][500+10];int teams[500+10];int dist[500+10];int byPass[500+10];int maxTeams[500+10];int difDist[500+10];bool visited[500+10];int selectMin(int n){    int minCity=-1;    int minDis=INF;for(int i=0;i<n;i++){if(!visited[i]&&dist[i]<minDis){minCity=i;minDis=dist[i];}}if(minCity==-1)return -1;visited[minCity]=true; for(int i=0;i<n;i++){    if(i!=minCity)            {            if(cities[minCity][i]!=INF&&cities[minCity][i]+dist[minCity]<dist[i])            {                dist[i]=cities[minCity][i]+dist[minCity];                difDist[i]=difDist[minCity];                maxTeams[i]=teams[i]+maxTeams[minCity];                byPass[i]=minCity;            }            else if(cities[minCity][i]!=INF&&cities[minCity][i]+dist[minCity]==dist[i])                {                    difDist[i]+=difDist[minCity];                    if(maxTeams[i]<teams[i]+maxTeams[minCity])maxTeams[i]=teams[i]+maxTeams[minCity];                }            }}return minCity;}void update(int minCity){}int main(){ int cityOne,cityTwo,distance;scanf("%d%d%d%d",&n,&m,&so,&ta);    for(int i=0;i<n;i++)        for(int j=0;j<n;j++){if(i==j)cities[i][j]=0;else cities[i][j]=INF;}for(int i=0;i<n;i++){ scanf("%d",&teams[i]); }for(int i=0;i<m;i++){scanf("%d%d%d",&cityOne,&cityTwo,&distance);cities[cityOne][cityTwo]=distance;cities[cityTwo][cityOne]=distance;}for(int i=0;i<n;i++){    if(cities[so][i]!=INF&&cities[so][i]!=0)        {             dist[i]=cities[so][i];             byPass[i]=so;             maxTeams[i]=teams[so]+teams[i];             difDist[i]=1;        }else{            byPass[i]=-1;            maxTeams[i]=0;            dist[i]=cities[so][i];            difDist[i]=0;        }    visited[i]=false;}visited[so]=true;difDist[so]=1;maxTeams[so]=teams[so];byPass[so]=so;while(true){int minDisCity=selectMin(n);if(minDisCity==-1)break;}printf("%d %d",difDist[ta],maxTeams[ta]);}

这题需要提一下的是:

1)核心步骤是Dijkstra算法。

2)增加两个矩阵分别存放最短路径的条数以及最大的teams。在更新dist矩阵的时候一并更新。

0 0
原创粉丝点击