您的位置:首页 > 其它

hdoj--2112 HDU Today(最短路径)

2016-02-26 22:29 281 查看
HDOJ 2112

题解
一个求最短路径的问题,与一般的最短路问题有所不同的是,此题图的结点是字符串。所以需要特殊处理。

一种策略是将每个字符串映射为一个整数,转化为普通的最短路问题。

还有一种是使用
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息