ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)
问题 F: (ds:图)旅游规划
时间限制: 1 Sec 内存限制: 128 MB
提交: 14 解决: 4
题目描述
有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。
输入
第一行为整数T,表示有T个case(测试实例)。
接下来每个case包含:
第1行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。
输出
在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。
样例输入
- 2
- 4 5 0 3
- 0 1 1 20
- 1 3 2 30
- 0 3 4 10
- 0 2 2 20
- 2 3 1 20
- 2 1 0 1
- 1 0 2 3
样例输出
- 3 40
- 2 3
苦于寻找如何对两个边权进行最短路的计算,无数次WA后总算是知道了。思路:首先正常合并当前边,然后若临时距离等于永久距离之和,则比较费用,若费用小则将费用变化一下。另外一个好处就是由于是搜索全部关联边,因此不用担心重边的问题
代码:
- #include<iostream>
- #include<algorithm>
- #include<cstdlib>
- #include<sstream>
- #include<cstring>
- #include<cstdio>
- #include<string>
- #include<deque>
- #include<stack>
- #include<cmath>
- #include<queue>
- #include<set>
- #include<map>
- #define INF 0x3f3f3f3f
- #define MM(x) memset(x,0,sizeof(x))
- using namespace std;
- typedef long long LL;
- struct info
- {
- int dx;
- int money;
- };
- info d[550];
- vector<pair<int,info> >que[550];
- int main(void)
- {
- int tcase;
- int n,m,i,j,x,y,z,s,t,des;
- scanf("%d",&tcase);
- while (tcase--)
- {
- for (i=0; i<550; i++)
- que[i].clear();
- memset(d,INF,sizeof(d));
- scanf("%d%d%d%d",&n,&m,&s,&des);
- info one;
- for (i=0; i<m; i++)
- {
- scanf("%d%d%d%d",&x,&y,&one.dx,&one.money);
- que[x].push_back(make_pair(y,one));
- que[y].push_back(make_pair(x,one));
- }
- priority_queue<pair<int,int> >Q;
- while (!Q.empty())
- Q.pop();
- d[s].dx=0;
- d[s].money=0;
- Q.push(make_pair(-d[s].dx,s));
- while (!Q.empty())
- {
- int now=Q.top().second;
- Q.pop();
- for (i=0; i<que[now].size(); i++)
- {
- int v=que[now][i].first;
- if(d[v].dx>d[now].dx+que[now][i].second.dx)
- {
- d[v].dx=d[now].dx+que[now][i].second.dx;
- d[v].money=d[now].money+que[now][i].second.money;
- Q.push(make_pair(-d[v].dx,v));
- }
- else if(d[v].dx==d[now].dx+que[now][i].second.dx&&d[v].money>d[now].money+que[now][i].second.money)
- d[v].money=d[now].money+que[now][i].second.money;
- }
- }
- printf("%d %d\n",d[des].dx,d[des].money);
- }
- return 0;
- }
ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)的更多相关文章
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)
问题 E: (ds:图)公路村村通 时间限制: 1 Sec 内存限制: 128 MB 提交: 9 解决: 5 题目描述 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本, ...
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(优先队列或sort+克鲁斯卡尔+并查集优化)
畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- ACM程序设计选修课——Problem D: (ds:树)合并果子(最优二叉树赫夫曼算法)
Problem D: (ds:树)合并果子 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 80 Solved: 4 [Submit][Status][ ...
- ACM程序设计选修课——1041: XX's easy problem(神烦的多次字符串重定向处理)
1041: XX's easy problem Time Limit: 1 Sec Memory Limit: 128 MB Submit: 41 Solved: 7 [Submit][Statu ...
- ACM程序设计选修课——1044: (ds:队列)打印队列(queue模拟)
问题 A: (ds:队列)打印队列 时间限制: 1 Sec 内存限制: 128 MB 提交: 25 解决: 4 [提交][状态][讨论版] 题目描述 网络工程实验室只有一台打印机,它承担了非常繁重 ...
- ACM程序设计选修课——1018: Common Subsequence(DP)
问题 L: Common Subsequence 时间限制: 1 Sec 内存限制: 32 MB 提交: 70 解决: 40 [提交][状态][讨论版] 题目描述 A subsequence of ...
- ACM程序设计选修课——1043: Radical loves integer sequences(YY)
1043: Radical loves integer sequences Time Limit: 1 Sec Memory Limit: 128 MB Submit: 36 Solved: 4 ...
- ACM程序设计选修课——1076汇编语言(重定向+模拟)
1076: 汇编语言 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 34 Solved: 4 [Submit][Status][Web Board] ...
- ACM程序设计选修课——1057: Beautiful Garden(模拟+耐心调试)
1057: Beautiful Garden Time Limit: 5 Sec Memory Limit: 128 MB Submit: 25 Solved: 12 [Submit][Statu ...
随机推荐
- 卓越管理的实践技巧(1)如何进行有效的指导 Guidelines for Effective Coaching
Guidelines for Effective Coaching 前文卓越管理的秘密(Behind Closed Doors)最后一部分提到了总结的13条卓越管理的实践技巧并列出了所有实践技巧名称的 ...
- python+opencv模拟生成运动模糊核
Mark:https://www.cnblogs.com/wyh1993/p/7118559.html 效果非常的好
- groff - groff 文档排版系统前端
总览 (SYNOPSIS) groff [ -abehilpstvzCENRSUVXZ ] [ -wname ] [ -Wname ] [ -mname ] [ -Fdir ] [ -Idir ] [ ...
- python 基础之格式化输出
字符占位符%s #_cvvh:"chenxi" #date: 2019/6/24 print ('chhjg') # 格式化输出 name = input("Name:& ...
- modelformset
class StudyRecordDeialView(View): def get(self, request, class_record_id): class_record_obj = models ...
- java基础—equals方法
一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class TestEquals { 4 public s ...
- .NET 中,编译器直接支持的数据类型称为基元类型(primitive type).基元类型和.NET框架类型(FCL)中的类型有直接的映射关系.
.NET 中,编译器直接支持的数据类型称为基元类型(primitive type).基元类型和.NET框架类型(FCL)中的类型有直接的映射关系. The primitive types are Bo ...
- manjaro(arch)里的vbox 安装centos7后,centos无法联网的解决办法
第一步,在VirtualBox中设置网卡连接方式:点“设置”,在弹出的界面中点“网络”,最后选择“连接方式”为“桥接网卡”. 回到centOS中,进入终端,输入命令:ip addr,查看网络配置文件的 ...
- poj--1064
题意:有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的绳子的话,这K条绳子最长能有多长?答案保留到小数点后2位. 思路:这些最大最小化问题大多数可以用二分查找的方法来解题 用 d 表 ...
- Linux学习-登录档的轮替(logrotate)
rsyslogd 利用的是 daemon 的方式来启动的, 当有需求的时候立刻就会被执行的,但是 logrotate 却是在规定的时间到了之后才来进行登录档的轮 替, 所以这个 logrotate 程 ...