• L3011 直捣黄龙


    #include<bits/stdc++.h>
    
    using namespace std;
    
    using pii = pair<int, int>;
    
    const int N = 300;
    vector<pair<int, int>> g[N];
    int have[N];
    int pre[N];
    int path[N];
    bool st[N];
    int dist[N];
    int n, k;
    int Kill[N];
    int jiefang[N];
    string start, endd;
    unordered_map<string, int> var;
    unordered_map<int, string> local;
    
    void dijkstra() {
       // memset(st, 0, sizeof st);
        memset(dist, 0x3f, sizeof dist);
        dist[var[start]] = 0;
        priority_queue<pii, vector<pii>, greater<pii>> heap;
        heap.push({dist[var[start]], var[start]});
        path[var[start]] = 1;
        while (heap.size()) {
            auto t = heap.top();
            heap.pop();
            int u = t.second;
            //cout << "u == " << u << " " << local[u] << "\n";;
            if (st[u]) continue;
            st[u] = true;
            for (auto itr : g[u]) {
                int v = itr.first, w = itr.second;
               // cout << "v" << " = " << v << " " << local[v] << "\n";
                //if (local[v] == "DBY") cout << "kaishi = " << "Kill " << Kill[v] << " jiefang " << jiefang[v] << "\n";
                if (dist[v] > dist[u] + w) { 
                    pre[v] = u;
                    Kill[v] = Kill[u] + have[v];
                    jiefang[v] = jiefang[u] + 1;
                    dist[v] = dist[u] + w;
                    heap.push({dist[v], v});
                   // cout << "---新更" << local[v] << " " << local[u] << "\n";
                    path[v] = path[u];
                   // cout << path[v] << " " << path[u] << "\n";
                } else if (dist[v] == dist[u] + w) {
                    if (jiefang[v] < jiefang[u] + 1) {
                        pre[v] = u;
                        jiefang[v] = jiefang[u] + 1;
                        Kill[v] = Kill[u] + have[v];
                    } else if (jiefang[v] == jiefang[u] + 1) {
                        if (Kill[v] < Kill[u] + have[v]) {
                            pre[v] = u;
                            Kill[v] = Kill[u] + have[v];
                        }
                    }
                    // cout << "---" << local[v] << " " << local[u] << "\n";
                    // cout << path[v] << " " << path[u] << "\n";
                    path[v] += path[u];
                }
                //if (local[v] == "DBY") cout << "jieshu = " << "Kill " << Kill[v] << " jiefang " << jiefang[v] << "\n";
                //cout << "pre " << local[v] << " = " << local[pre[v]] << "\n";
            }
            //cout << "\n\n";
        }
        
        int ed = var[endd];
        int edd = ed;
        int sta = var[start];
        //cout << local[ed] << " " << local[st] << "\n";
        vector<string> res; 
        while (ed != sta) {
            res.push_back(local[ed]);
            //cout << local[ed] << "\n";
            ed = pre[ed];
        }
        res.push_back(local[sta]);
        for (int i = res.size() - 1; i >= 0; i--) {
            cout << res[i];
            if (i != 0) cout << "->";
        }
        cout << "\n";
        //cout << local[ed] << "\n";
        //cout << 
        // cout << path[var["ATP"]] << "\n";
        // cout << path[var["PTA"]] << "\n";
        // cout << path[var["PMS"]] << "\n";
        // cout << path[var["LNN"]] << "\n";
        // cout << path[var["PDS"]] << "\n";
        // cout << path[var["TAP"]] << "\n";
        // cout << path[var["DBY"]] << "\n";
        cout << path[edd] << " ";
        cout << dist[edd] << " "; //距离正确s
        cout << Kill[edd] << "\n";
    }
    
    int main() {
        //map<int, int> have;
        cin >> n >> k;
        cin >> start >> endd;
        int id = 1;
        var[start] = id, local[id] = start, id++;
        var[endd] = id, local[id] = endd, id++;
        for (int i = 1; i <= n - 1; i++) {
            string s;
            int cnt;
            cin >> s >> cnt;
            if (var.count(s)) have[var[s]] = cnt;
            else {
                var[s] = id;
                local[id] = s;
                have[id] = cnt;
                id++;
            }
        }
    
        for (int i = 0; i < k; i++) {
            string a, b;
            int w;
            cin >> a >> b >> w;
            int vara = var[a], varb = var[b];
            g[vara].push_back({varb, w}); //a -> b w
            g[varb].push_back({vara, w});
        }
    
        dijkstra();
        
        return 0;
    }
    
  • 相关阅读:
    【LCA倍增】POJ1330-Nearest Common Ancestors
    【AC自动机/fail树】BZOJ3172- [Tjoi2013]单词
    【费用流】BZOJ1221-[HNOI2001] 软件开发
    【KM】POJ2195/HDU1533-Going home
    【KM算法】HDU2255-奔小康赚大钱
    【匈牙利算法】BZOJ1059-[ZJOI2007]矩阵游戏
    【KMP】BZOJ3670-[Noi2014]动物园
    【Treap】BZOJ1588-[HNOI2002]营业额统计
    【Treap模板详细注释】BZOJ3224-普通平衡树
    【tarjan求割顶】BZOJ2730-[HNOI2012]矿场搭建
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/16173025.html
Copyright © 2020-2023  润新知