ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)
来源:互联网 发布:怎么能成为淘宝客 编辑:程序博客网 时间:2024/05/17 01:32
问题 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。输入保证解的存在。
输出
在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。
样例输入
24 5 0 30 1 1 201 3 2 300 3 4 100 2 2 202 3 1 202 1 0 11 0 2 3
样例输出
3 402 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;}
0 0
- ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(优先队列或sort+克鲁斯卡尔+并查集优化)
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)
- ACM程序设计选修课——1044: (ds:队列)打印队列(queue模拟)
- ACM程序设计选修课——Problem D: (ds:树)合并果子(最优二叉树赫夫曼算法)
- ACM程序设计选修课——1049: Efface Numbers(贪心)
- ACM程序设计选修课——1058: Lucky Sequence(思考)
- ACM程序设计选修课——1081: 堆(BFS)
- ACM程序设计选修课——1041: XX's easy problem(神烦的多次字符串重定向处理)
- NBOJv2——Problem 1037: Wormhole(map邻接表+优先队列SPFA)
- ACM程序设计选修课——1018: Common Subsequence
- ACM程序设计选修课——1030: Hungar的时尚球场(水题+耐心)
- ACM程序设计选修课——1051: Glamor Sequence(YY+求和公式)
- ACM程序设计选修课——1043: Radical loves integer sequences(YY)
- ACM程序设计选修课——1065: Operations on Grids(暴力字符串)
- ACM程序设计选修课——1057: Beautiful Garden(模拟+耐心调试)
- ACM程序设计选修课——1076汇编语言(重定向+模拟)
- ACM程序设计选修课——1036: Hungar的菜鸟赛季(YY)
- 旅行
- 类小结1:方法重载 变量 封装 import 继承 重写父类方法 调用父类构造方法 多态
- UIButton(UIEdgeInsets)/设置button上的文字和图片上下垂直居中对齐
- IR077K firmware设计
- matlab2013a(x64) 安装 libsvm
- ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)
- Redis安装整理(windows) +php扩展redis
- android邮件收发时出现账号密码错误
- 使用Object-C实现23种设计模式之原型模式
- Android官方开发文档Training系列课程中文版:OpenGL绘图之添加动态效果
- OpenCV(学习笔记7)-图像修复
- 背包问题
- MySQL Meta中的length字段 -- (5) 开始懂了
- HDU 1097 A hard puzzle(快速幂取模)