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的更多相关文章

  1. 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 ...

  2. PAT A 1030. Travel Plan (30)【最短路径】

    https://www.patest.cn/contests/pat-a-practise/1030 找最短路,如果有多条找最小消耗的,相当于找两次最短路,可以直接dfs,数据小不会超时. #incl ...

  3. PAT甲级——A1030 Travel Plan

    A traveler's map gives the distances between cities along the highways, together with the cost of ea ...

  4. 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 ...

  5. PAT 1030 Travel Plan[图论][难]

    1030 Travel Plan (30)(30 分) A traveler's map gives the distances between cities along the highways, ...

  6. 1030 Travel Plan (30 分)

    1030 Travel Plan (30 分) A traveler's map gives the distances between cities along the highways, toge ...

  7. [图算法] 1030. Travel Plan (30)

    1030. Travel Plan (30) A traveler's map gives the distances between cities along the highways, toget ...

  8. 【PAT甲级】1030 Travel Plan (30 分)(SPFA,DFS)

    题意: 输入N,M,S,D(N,M<=500,0<S,D<N),接下来M行输入一条边的起点,终点,通过时间和通过花费.求花费最小的最短路,输入这条路径包含起点终点,通过时间和通过花费 ...

  9. PAT (Advanced Level) 1030. Travel Plan (30)

    先处理出最短路上的边.变成一个DAG,然后在DAG上进行DFS. #include<iostream> #include<cstring> #include<cmath& ...

随机推荐

  1. Nginx HTTPS功能部署实践

    本文出处:http://oldboy.blog.51cto.com/2561410/1889346 30.1 文档目的 本文目的提高自己文档的写作能力及排版能力,加强上课所讲的内容得以锻炼也方便自己以 ...

  2. leetcode 460. LFU Cache

    hash:存储的key.value.freq freq:存储的freq.key,也就是说出现1次的所有key在一起,用list连接 class LFUCache { public: LFUCache( ...

  3. Zookeeper入门(二)之基础

    在深入了解ZooKeeper的运作之前,让我们来看看ZooKeeper的基本概念.本文主要包含如下内容:1.Architecture(架构)2.Hierarchical namespace(层次命名空 ...

  4. Android String.xml中的符号总结

    <b></b>加粗字体 <i></i> 斜体字体 <u></u> 给字体加下划线 \n 换行 \u0020表示空格 \u2026 ...

  5. java中sleep()方法的解析

    Thread.sleep(3000); 就是指让当前正在运行的占用cpu时间片的线程挂起3000ms,把cpu的时间片交给其他线程,但是并没有指定把CPU的时间片接下来到底交给哪个线程,而是让这些线程 ...

  6. day 30

    今日内容: 单例模式的四种方法 网络编程的介绍 单例模式: 什么是单例模式? 单例模式就是经过多次实例化,指向的是同一实例 为何要用单例模式? 可以节省内存资源 如何用单例模式? 方式一:利用绑定方法 ...

  7. 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明

    程序发布后出现问题: 无法读取配置节“oracle.manageddataaccess.client”,因为它缺少节声明 解决办法: 1.安装了odac12.  ODTwithODAC121010.z ...

  8. Spring 整合Mybatis实例

    演示样例下载地址:http://download.csdn.net/detail/geloin/4506640 本文基于Spring 注解,让Spring跑起来.本文使用Mysql数据库. (1) 导 ...

  9. Python操作Saltstack

    1.代码 # -*- coding:utf-8 -*- import urllib.request import urllib.parse import json class saltAPI(): d ...

  10. Hibernae

    开始尝试挺java ee的课程,马士兵老师的 1.ssh的整个框架体系 spring会贯穿在整个过程之中 2.Hibernate的整个框架体系 3. 4. 5. 6.