[中等] 堆优化的Dijkstra实现
来源:互联网 发布:emlog源码下载 编辑:程序博客网 时间:2024/05/17 18:01
- 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
- 输入:
- 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点t。n和m为0时输入结束。
(1<n<=1000, 0<m<100000, s != t) - 输出:
- 输出 一行有两个数, 最短距离及其花费。
- 样例输入:
3 21 2 5 62 3 4 51 30 0
- 样例输出:
9 11
- 思路:
- 本题思路比较简单,就是一个单纯的最短路问题,不过稍微拐弯一点的地方就是本题有两个条件,一个是距离一个是花费,只要把这个地方处理好,基本没什么问题。
- 具体代码:
#include <iostream>#include <queue>#include <vector>using namespace std;struct Edge{ int from,to; int dist; int cost; Edge(int tf,int tt,int td,int tc):from(tf),to(tt),dist(td),cost(tc){}};struct HeadNode{ int v; int d; int p; HeadNode(int tv,int td,int tp):v(tv),d(td),p(tp){} //注意此处有两个条件 bool operator < (const HeadNode& rhs) const { if(d==rhs.d) return p>rhs.p; //注意是大于,因为priority_queue是大根堆 else return d>rhs.d; }};const int maxn=1000+5;const int INF=1000000000;struct Dij{ int n,m; vector<Edge> edges; vector<int> G[maxn]; bool done[maxn]; int d[maxn]; int p[maxn]; int path[maxn]; void init(int tn) { n=tn; edges.clear(); for(int i=0;i<n;++i) G[i].clear(); } void addEdge(int tu,int tv,int td,int tc) { edges.push_back(Edge(tu,tv,td,tc)); m=edges.size(); G[tu].push_back(m-1); } void dijkstra(int s) { fill(done,done+n,false); fill(d,d+maxn,INF); priority_queue<HeadNode> pq; d[s]=0; p[s]=0; pq.push(HeadNode(s,0,0)); while(!pq.empty()) { HeadNode t=pq.top();pq.pop(); int u=t.v; if(done[u]) continue; for(int i=0;i<G[u].size();++i) { Edge& e=edges[G[u][i]]; //注意有两个条件时如何松弛 if(d[e.to]>d[u]+e.dist||d[e.to]==d[u]+e.dist&&p[e.to]>p[u]+e.cost) { d[e.to]=d[u]+e.dist; p[e.to]=p[u]+e.cost; path[e.to]=G[u][i];//最短路上当前结点的上一条弧,本题用不到 pq.push(HeadNode(e.to,d[e.to],p[e.to])); } } } }};Dij dij;int main(){ int n,m; for(cin>>n>>m;n!=0||m!=0;cin>>n>>m) { dij.init(n); for(int i=0;i<m;++i) { int a,b,d,p; cin>>a>>b>>d>>p; dij.addEdge(a,b,d,p); } int s,des; cin>>s>>des; dij.dijkstra(s); cout<<dij.d[des]<<" "<<dij.p[des]<<endl; } return 0;}
题目描述:
阅读全文
0 0
- [中等] 堆优化的Dijkstra实现
- 堆优化的Dijkstra
- Heap+Dijkstra堆优化的Dijkstra
- 堆优化的Dijkstra算法
- 堆优化的dijkstra(迪杰斯特拉)
- Dijkstra算法的堆实现
- poj 2502 题解 & dijkstra的堆优化
- 白书上的dijkstra+堆优化/dijkstra的一些性质
- DIJKSTRA堆优化
- Dijkstra + 堆优化
- 堆优化Dijkstra模版
- Dijkstra+堆优化
- 堆优化Dijkstra
- 堆优化Dijkstra
- Dijkstra + 堆优化
- Dijkstra+堆优化 模板
- Dijkstra堆优化
- [ 模板 ] 堆优化Dijkstra
- HTML表单(HTML Form)中get 和post 的区别
- fabric-sdk-java源码maven项目环境搭建
- 供应商屏幕增强
- node.js 用户上传图片到服务器
- Use varargs judiciously
- [中等] 堆优化的Dijkstra实现
- 自定义View之视差特效
- 为什么要源码编译
- HDU 6165 FFF at Valentine(强连通 缩点 17多校第九场)
- iOS进阶之巧用IBInspectable属性和IB_DESIGNABLE宏定义
- linux系统性安装mysql服务器(基于CentOS)
- HTML&CSS基础篇之十五:表格&列表
- 【POJ】2362 Square(DFS)
- 完整css选择器总结