zoukankan      html  css  js  c++  java
  • 【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;
    }
    
  • 相关阅读:
    Js:返回上一页
    select设置选中项/select的级联
    js闭包
    bootstrap
    My97DatePicker使用 、layDate 日期与时间组件
    IO流
    java之String工具类和File类
    Python学习之路文件file常用方法
    Python学习之路-集合set的常用方法
    Python学习之路-字典外传
  • 原文地址:https://www.cnblogs.com/AWCXV/p/14105219.html
Copyright © 2011-2022 走看看