• 【Codeforces Alpha Round #20 C】Dijkstra?


    题目链接

    链接

    翻译

    让你求出 (1)(n) 的最短路,打印路径。

    题解

    最短路堆优化。

    记得 (dis) 数组开 (long long), 不然溢出会导致 (TLE) 问题 >_<

    代码 (1)(multiset) 写法。
    代码 (2)(priority queue) 写法。

    代码1

    #include <bits/stdc++.h>
    #define LL long long
    using namespace std;
    
    struct abc{
        int id;
        LL dis;
        bool operator<(const abc &b)const{
            if (dis < b.dis){
                return true;
            }else if (dis == b.dis && id < b.id){
                return true;
            }
            return false;
        }
    };
    
    const int N = 1e5;
    LL dis[N+10];
    int n,m,pre[N + 10];
    vector<pair<int,int> > g[N+10];
    bool vis[N + 10];
    multiset<abc> myset;
    
    void dfs(int n){
        if (n == 0){
            return;
        }
        dfs(pre[n]);
        cout << n <<" ";
    }
    
    int main(){
        ios::sync_with_stdio(0),cin.tie(0);
        cin >> n >> m;
        for (int i = 1;i <= m; i++){
            int x,y,z;
            cin >> x >> y >> z;
            g[x].push_back(make_pair(y,z));
            g[y].push_back(make_pair(x,z));
        }
        memset(dis,255,sizeof dis);
        dis[1] = 0;
        abc temp;
        temp.dis = 0;temp.id = 1;
        myset.insert(temp);
        while (!myset.empty()){
            abc tmp = *(myset.begin());
            myset.erase(myset.begin());
            int x = tmp.id;
            for (pair<LL,int> temp:g[x]){
                int y = temp.first,w = temp.second;
                if (dis[y] == -1 || dis[y] > dis[x] + w){
                    abc tmp;
                    if (dis[y] != -1){
                        tmp.dis = dis[y];tmp.id = y;
                        myset.erase(myset.find(tmp));
                    }
                    dis[y] = dis[x] + w;
                    pre[y] = x;
                    tmp.id = y;tmp.dis = dis[y];
                    myset.insert(tmp);
                }
            }
        }
        if (dis[n] == -1){
            cout << -1 << endl;
        }else{
            dfs(n);
        }
        return 0;
    }
    
    

    代码2

    #include <bits/stdc++.h>
    #define LL long long
    using namespace std;
    
    const int N = 1e5;
    LL dis[N+10];
    int n,m,pre[N + 10];
    vector<pair<int,int> > g[N+10];
    priority_queue<pair<LL,int>,vector<pair<LL,int> >,greater<pair<LL,int> > > pq;
    
    void dfs(int n){
        if (n == 0){
            return;
        }
        dfs(pre[n]);
        cout << n <<" ";
    }
    
    int main(){
        ios::sync_with_stdio(0),cin.tie(0);
        cin >> n >> m;
        for (int i = 1;i <= m; i++){
            int x,y,z;
            cin >> x >> y >> z;
            g[x].push_back(make_pair(y,z));
            g[y].push_back(make_pair(x,z));
        }
        memset(dis,255,sizeof dis);
        dis[1] = 0;
        pq.push(make_pair(0,1));
        while (!pq.empty()){
            pair<LL,int> tmp = pq.top();
            pq.pop();
            int x = tmp.second;
            if (dis[x]!= -1 && dis[x] < tmp.first){
                continue;
            }
            for (pair<LL,int> temp:g[x]){
                int y = temp.first,w = temp.second;
                if (dis[y] == -1 || dis[y] > dis[x] + w){
                    dis[y] = dis[x] + w;
                    pre[y] = x;
                    pq.push(make_pair(dis[y],y));
                }
            }
        }
        if (dis[n] == -1){
            cout << -1 << endl;
        }else{
            dfs(n);
        }
        return 0;
    }
    
  • 相关阅读:
    用ProFTPD构建FTP服务器
    Js数组里剔除指定的元素(不是指定的位置)
    JS跨域设置和取Cookie
    ajax test
    js下判断 iframe 是否加载完成的完美方法
    使用div模拟出frameset效果
    js中call与apply用法
    phpstorm 快捷键
    JQuery中 数组与字符串(过滤,排序,拆分,合并)
    基于 Apache 在本地配置多个虚拟主机
  • 原文地址:https://www.cnblogs.com/AWCXV/p/14105219.html
Copyright © 2020-2023  润新知