hdoj--2112 HDU Today(最短路径)
2016-02-26 22:29
281 查看
HDOJ 2112
一个求最短路径的问题,与一般的最短路问题有所不同的是,此题图的结点是字符串。所以需要特殊处理。
一种策略是将每个字符串映射为一个整数,转化为普通的最短路问题。
还有一种是使用
需要注意的一点是,目的地有可能是公交车到不了的,WA一次。
题解 |
一种策略是将每个字符串映射为一个整数,转化为普通的最短路问题。
还有一种是使用
map,思想仍然是映射。
需要注意的一点是,目的地有可能是公交车到不了的,WA一次。
#include <iostream> #include <cstdio> #include <map> #include <string> #include <queue> #include <vector> #include <fstream> #include <algorithm> using namespace std; const int maxe = 10000 + 5; const int inf = 1 << 30; struct Edge{ string from, to; int dist; Edge(string u, string v, int d):from(u), to(v), dist(d) {} }; struct HeapNode { int d; string u; bool operator < (const HeapNode& rhs) const{ return d > rhs.d; } }; int n; vector<Edge> edges; map<string, vector<int> > G; map<string, int> d, done; string st, en; void addEage(string from, string to, int dist) { edges.push_back(Edge(from, to, dist)); int idx = edges.size() - 1; G[from].push_back(idx); } void dijkstra() { if(d.count(en) == 0) { cout << -1 << endl; return; } //终点是公交车到不了的 priority_queue<HeapNode> Q; d[st] = 0; Q.push((HeapNode){0, st}); while(!Q.empty()) { HeapNode x = Q.top(); Q.pop(); string u = x.u; if(done[u]) continue; done[u] = 1; for(int i = 0; i < (int)G[u].size(); ++i) { Edge& e = edges[G[u][i]]; d[e.to] = min(d[e.to], d[u] + e.dist); Q.push((HeapNode){d[e.to], e.to}); } } if(d[en] == inf) cout << -1 << endl; else cout << d[en] << endl; } int main() { //fstream cin("data.in"); ios::sync_with_stdio(false); string u, v; int w; while(cin >> n && n != -1) { if(n == 0){ cout << -1 << endl; continue; } G.clear(); edges.clear(); d.clear(); cin >> st >> en; for(int i = 0; i < n; ++i) { cin >> u >> v >> w; d[u] = inf, done[u] = 0; d[v] = inf, done[v] = 0; addEage(u, v, w); addEage(v, u, w); } dijkstra(); } return 0; }
相关文章推荐
- 详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
- python编写的最短路径算法
- 基于Java实现的Dijkstra算法示例
- 【算法】最短路径之A*搜索
- Dijkstra和floyd——求单源点最短路径
- 2015 Multi-University Training Contest 6 Solutions
- 初学图论-Dijkstra单源最短路径算法
- 初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- Dijkstra算法的粗略学习
- 【高手回避】poj3268,一道很水的dijkstra算法题
- poj2387 Til the Cows Come Home—Dijkstra模板
- poj 1511 Invitation Cards
- Sum Problem
- 最少步数BFS
- Dijkstra 算法实现及问题
- Djkstra
- 最短路
- Dijkstra算法
- Dijkstra算法