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

      

  • 相关阅读:
    STM32---GPIO
    SQLITE笔记
    STM32 ---- PWM
    STM32--- IIC使用
    TP配置apache下Rewrite模式
    韩顺平老师SNS数据库表 http://blog.csdn.net/zxman660/article/details/7786994
    HashMap和HashTable的区别http://blog.csdn.net/shohokuf/article/details/3932967
    HashMap和HashSet的区别http://www.importnew.com/6931.html
    在mysql中存储生日,php中计算今天是否为用户生日
    文件的MIME类型
  • 原文地址:https://www.cnblogs.com/lautsie/p/3391059.html
Copyright © 2020-2023  润新知