http://wikioi.com/problem/1079/
单源最短路径,可以用dijkstra来做。这里采用了heap优化,复杂度是(V+E)logV。这里用了STL的优先队列(堆),重复加入pair没有问题,因为dist小的会先出来。为了避免重复扩展,用了visit判重,这个也不是必须的。
注意的是:
1.pair使用的时候,把距离放在first的位置,那么在priority queue里,距离小的会先出来。
2.priority_queue<pp, vector<pp>, greater<pp> > que;这样定义,小的先出来。
3.使用graph[from][to] ?来判断是否用from=>to这条路。
#include <iostream> #include <queue> #include <vector> #include <map> #include <set> #include <utility> #include <climits> #include <functional> using namespace std; #define pp pair<int, char> int main() { int n; cin >> n; map<char, map<char, int> > graph; // 'A'-'Z', 'a'-'z' map<char, int> dist; set<char> visit; for (int i = 0; i < n; i++) { char from, to; int weight; cin >> from >> to >> weight; graph[from][to] = min(weight, graph[from][to] ? graph[from][to]: INT_MAX); graph[to][from] = min(weight, graph[to][from] ? graph[to][from]: INT_MAX); } int ans = INT_MAX; char ansc; priority_queue<pp, vector<pp>, greater<pp> > que; dist['Z'] = 0; que.push(pp(0, 'Z')); while (!que.empty()) { pp edge = que.top(); que.pop(); int weight = edge.first; char node = edge.second; if (visit.count(node) != 0) continue; visit.insert(node); for (map<char,int>::iterator it = graph[node].begin(); it != graph[node].end(); it++) { if (!dist.count(it->first) || it->second + dist[node] < dist[it->first]) { // add to que dist[it->first] = it->second + dist[node]; que.push(pp(dist[it->first], it->first)); if (ans > dist[it->first] && it->first >= 'A' && it->first < 'Z') { ans = dist[it->first]; ansc = it->first; } } } } cout << ansc << " " << ans << endl; return 0; }