PAT 甲级 1030 Travel Plan
https://pintia.cn/problem-sets/994805342720868352/problems/994805464397627392
A traveler's map gives the distances between cities along the highways, together with the cost of each highway. Now you are supposed to write a program to help a traveler to decide the shortest path between his/her starting city and the destination. If such a shortest path is not unique, you are supposed to output the one with the minimum cost, which is guaranteed to be unique.
Input Specification:
Each input file contains one test case. Each case starts with a line containing 4 positive integers N, M, S, and D, where N (≤) is the number of cities (and hence the cities are numbered from 0 to N−1); M is the number of highways; S and D are the starting and the destination cities, respectively. Then M lines follow, each provides the information of a highway, in the format:
City1 City2 Distance Cost
where the numbers are all integers no more than 500, and are separated by a space.
Output Specification:
For each test case, print in one line the cities along the shortest path from the starting point to the destination, followed by the total distance and the total cost of the path. The numbers must be separated by a space and there must be no extra space at the end of output.
Sample Input:
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
Sample Output:
0 2 3 3 4
代码:
#include <bits/stdc++.h>
using namespace std; #define inf 0x3f3f3f3f int N, M, S, D;
int mp[550][550], cost[550][550];
int dis1[550],dis2[550],dis3[550];
int vis[550];
int pre[550]; int MinStep, out = INT_MAX; void dijkstra(int S, int dis[]) {
dis[S] = 0;
memset(vis, 0, sizeof(vis));
int temp = S; for(int i = 0; i < N; i ++) {
int minn = inf;
for(int j = 0; j < N; j ++) {
if(dis[j] < minn && vis[j] == 0) {
minn = dis[j];
temp = j;
}
}
vis[temp] = 1;
for(int k = 0; k < N; k ++)
if(vis[k] == 0 && mp[temp][k] != inf) {
if(dis[k] > mp[temp][k] + dis[temp])
dis[k] = mp[temp][k] + dis[temp];
}
}
} void dijkstra(int S) { dis3[S] = 0;
memset(vis, 0, sizeof(vis));
int temp = S; for(int i = 0; i < N; i ++) {
int minn = inf;
for(int j = 0; j < N; j ++) {
if(dis3[j] < minn && vis[j] == 0) {
minn = dis3[j];
temp = j;
}
}
vis[temp] = 1;
for(int k = 0; k < N; k ++)
if(mp[temp][k] + dis1[temp] + dis2[k] == MinStep)
if(vis[k] == 0 && cost[temp][k] != inf)
if(dis3[k] > cost[temp][k] + dis3[temp]){
dis3[k] = cost[temp][k] + dis3[temp];
pre[k] = temp;
}
}
} void output(int d){
if(d==-1) return ;
output(pre[d]);
printf("%d ", d);
} int main() { memset(pre,-1, sizeof(pre));
memset(vis, 0, sizeof(vis));
memset(cost,inf, sizeof(cost)); memset(dis1, inf, sizeof(dis1));
memset(dis2, inf, sizeof(dis2));
memset(dis3, inf, sizeof(dis3)); memset(mp, inf, sizeof(mp)); scanf("%d%d%d%d", &N, &M, &S, &D);
for(int i = 0; i < M; i ++) {
int st, en, dist, val;
scanf("%d%d%d%d", &st, &en, &dist, &val);
mp[st][en] = mp[en][st] = min(dist, mp[en][st]);
cost[st][en] = cost[en][st] = min(val, cost[st][en]);
} dijkstra(S, dis1);
dijkstra(D, dis2); MinStep = dis1[D]; dijkstra(S); output(D);
printf("%d %d\n", dis1[D], dis3[D]);
return 0;
}
两遍 dijkstra 一上午经历了无数遍点开题目又退出 枯了 睡一会清醒清醒再来写吧
PAT 甲级 1030 Travel Plan的更多相关文章
- PAT 甲级 1030 Travel Plan (30 分)(dijstra,较简单,但要注意是从0到n-1)
1030 Travel Plan (30 分) A traveler's map gives the distances between cities along the highways, to ...
- PAT A 1030. Travel Plan (30)【最短路径】
https://www.patest.cn/contests/pat-a-practise/1030 找最短路,如果有多条找最小消耗的,相当于找两次最短路,可以直接dfs,数据小不会超时. #incl ...
- PAT甲级——A1030 Travel Plan
A traveler's map gives the distances between cities along the highways, together with the cost of ea ...
- PAT Advanced 1030 Travel Plan (30) [Dijkstra算法 + DFS,最短路径,边权]
题目 A traveler's map gives the distances between cities along the highways, together with the cost of ...
- PAT 1030 Travel Plan[图论][难]
1030 Travel Plan (30)(30 分) A traveler's map gives the distances between cities along the highways, ...
- 1030 Travel Plan (30 分)
1030 Travel Plan (30 分) A traveler's map gives the distances between cities along the highways, toge ...
- [图算法] 1030. Travel Plan (30)
1030. Travel Plan (30) A traveler's map gives the distances between cities along the highways, toget ...
- 【PAT甲级】1030 Travel Plan (30 分)(SPFA,DFS)
题意: 输入N,M,S,D(N,M<=500,0<S,D<N),接下来M行输入一条边的起点,终点,通过时间和通过花费.求花费最小的最短路,输入这条路径包含起点终点,通过时间和通过花费 ...
- PAT (Advanced Level) 1030. Travel Plan (30)
先处理出最短路上的边.变成一个DAG,然后在DAG上进行DFS. #include<iostream> #include<cstring> #include<cmath& ...
随机推荐
- MetaMask/eth-block-tracker
https://github.com/MetaMask/eth-block-tracker A JS module for keeping track of the latest Ethereum b ...
- single number和变体
给array of integers. 裡面有一个数字是单独出现 其他都会出现两次(而且一起出现)ex: [1,2,2,3,3]要判断哪个数字是单独出现的. 以这个例子的话就是 1 LZ 一开始先说 ...
- WorldWind源码剖析系列:视景体类Frustum
PluginSDK中的视景体类Frustum是三维计算机图形学中的概念,主要用来描述透视投影的过程.三维计算机图形学中关于三维物体的渲染,Direct3D和OpenGL都是先通过对现实世界中的场景先进 ...
- 分布式计算(一)Ubuntu搭建Hadoop分布式集群
最近准备接触分布式计算,学习分布式计算的技术栈和架构知识.目前的分布式计算方式大致分为两种:离线计算和实时计算.在大数据全家桶中,离线计算的优秀工具当属Hadoop和Spark,而实时计算的杰出代表非 ...
- Java中 Vector的使用详解
Vector 可实现自动增长的对象数组. java.util.vector提供了向量类(Vector)以实现类似动态数组的功能. 创建了一个向量类的对象后,可以往其中随意插入不同类的对象,即不需顾及类 ...
- POJ 2367 Genealogical tree 拓扑排序入门题
Genealogical tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8003 Accepted: 5184 ...
- Oracle 解决【ORA-01704:字符串文字太长】
错误提示:oracle在toad中执行一段sql语句时,出现错误‘ORA-01704:字符串文字太长’.如下图: 原因:一般为包含有对CLOB字段的数据操作.如果CLOB字段的内容非常大的时候,会导致 ...
- 解决EF使用context.Database.SqlQuery时NotMapped属性列为空null的问题(转载)
有时候我们要为EF中的Model加一个新属性,这个属性不是数据库中的字段,而是从其它表中关联出来的.EF中要标示一个列不是对应表中字段只需要加上NotMapped特性.要使用NotMapped,保证你 ...
- 算法篇(前序)——Java的集合
菜鸟拙见,望请纠正:附上JDK参考文档(中文文档和英文文档):链接:https://pan.baidu.com/s/14KDmCtQxeGCViq7e0zENjA 密码:e9xs 以及算法篇全文链接 ...
- ASP.NET Core 3.0 实战:构建多版本 API 接口
第一次在博客写分享,请多多捧场,如有歧义请多多包含! 因为业务需求发展需要,所以API接口的变更升级是必不可少的事情,而原有的接口是不可能马上停止使用的.例如:Login接口为例,1.0版本之返回用户 ...