zoukankan      html  css  js  c++  java
  • [wikioi]回家

    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;
    }
    

      

  • 相关阅读:
    领域建模
    中科院
    开放搜索服务OpenSearch
    GUIForDebug
    java: org.luaj.vm2.LuaError:XXX module not found lua脚本初始化出错(转)
    new TimerTask(robot)(转)
    lua-TestMore(转)
    Lua 数据库访问(转)
    推荐谈论高并发柱
    查看文章strncpy()功能更好的文章
  • 原文地址:https://www.cnblogs.com/lautsie/p/3391059.html
Copyright © 2011-2022 走看看