pta-旅游规划

在畅通工程里加上最短路可能的条件,这时候就要判断花的钱是否最短,两者结合就能AC

https://pta.patest.cn/pta/test/15/exam/4/question/717

5-9 旅游规划   (25分)

有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

输入格式:

输入说明:输入数据的第1行给出4个正整数NNNMMMSSSDDD,其中NNN2≤N≤5002\le N\le 5002N500)是城市的个数,顺便假设城市的编号为0~(N−1N-1N1);MMM是高速公路的条数;SSS是出发地的城市编号;DDD是目的地的城市编号。随后的MMM行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。

输出格式:

在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20

输出样例:

3 40




#include
#define INF 0xfffffff
using namespace std;
int n,m;
int s,t;
int map[501][501],map1[501][501];
int dis[501],vis[501],fee[501];
void dijsktra(){
int i,j;
for(i=0;idis[i]=map[s][i];
fee[i]=map1[s][i];
vis[i]=0;
}
dis[s]=0;
fee[s]=0;
for(i=0;iint maxx=INF;
int mxx=INF;
int k;
for(j=0;jif(vis[j]==0&&dis[j]maxx=dis[j];
mxx=fee[j];
k=j;
}
if(vis[j]==0&&dis[j]==maxx){
                if(fee[j]                     maxx=dis[j];
                    mxx=fee[j];
                    k=j;
                }
}
}
vis[k]=1;
for(j=0;jif(vis[j]==0&&dis[j]>dis[k]+map[k][j]){
dis[j]=dis[k]+map[k][j];
fee[j]=fee[k]+map1[k][j];}
if(vis[j]==0&&dis[j]==dis[k]+map[k][j]){
                if(fee[j]>fee[k]+map1[k][j]){
                    dis[j]=dis[k]+map[k][j];
                    fee[j]=fee[k]+map1[k][j];
                }
}
}
}
cout< }
int main(){
int a,b,x,y;
while(cin>>n>>m>>s>>t){
for(int i=0;ifor(int j=0;jmap[i][j]=INF;
map1[i][j]=INF;
}
}
while(m--){
cin>>a>>b>>x>>y;
map[a][b]=map[b][a]=x;
map1[a][b]=map1[b][a]=y;
}
dijsktra();
}
return 0;
}

你可能感兴趣的:(ACM。,ACM。dijkstra算法)