제출 #1192038

#제출 시각아이디문제언어결과실행 시간메모리
1192038jbn8Commuter Pass (JOI18_commuter_pass)C++20
0 / 100
0 ms320 KiB
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <functional>
using namespace std;
#define int long long
int N, M;
int S, T;
int U, V;
vector<map<int, int>> G;
class Node{
public:
    int cost, node, from;
    const bool operator>(const Node& o) const{
        return cost > o.cost;
    }
    const bool operator>=(const Node& o) const{
        return cost >= o.cost;
    }
    const bool operator<=(const Node& o) const{
        return cost <= o.cost;
    }
    const bool operator<(const Node& o) const{
        return cost < o.cost;
    }
};
vector<bool> is_in_solut(vector<vector<int>> G, int node){
    vector<bool> visited(N);
    function<void(int)> dfs;
    dfs = [&](int node){
        if(visited[node])return;
        visited[node] = true;
        for(int next_node:G[node]){
            if(!visited[next_node])
                dfs(next_node);
        }
    };
    dfs(node);
    return visited;
}
signed main(){
    cin >> N >> M;
    cin >> S >> T;
    cin >> U >> V;
    for(int i=0; i<M; i++){
        int node0, node1, cost;
        cin >> node0 >> node1 >> cost;
        G[node0][node1] = cost;
    }
    priority_queue<Node> Q;
    vector<int> S_T(N);
    vector<vector<int>> S_Tfrom(N);
    Q.push({0, S, -1});
    while(!Q.empty()){
        Node cur=Q.top();
        Q.pop();
        if(S_T[cur.node] != -1){
            if(S_T[cur.node] == cur.cost)
                S_Tfrom[cur.node].push_back(cur.from);
            continue;
        }
        if(cur.node == T)break;
        S_T[cur.node] = cur.cost;
        S_Tfrom[cur.node].push_back(cur.from);
        for(auto A:G[cur.node]){
            if(S_T[A.first] == -1)
                Q.push({cur.cost+A.second, A.first, cur.node});
        }
    }
    vector<bool> is_good = is_in_solut(S_Tfrom, T);
    Q = priority_queue<Node>();
    vector<int> U_V(N);
    Q.push({0, V, -1});
    while(!Q.empty()){
        Node cur=Q.top();
        Q.pop();
        if(U_V[cur.node] != -1)
            continue;
        if(is_good[cur.node]){
            cout << cur.cost << '\n';
            return 0;
        }
        U_V[cur.node] = cur.cost;
        for(auto A:G[cur.node]){
            if(U_V[A.first] == -1)
                Q.push({cur.cost+A.second, A.first, cur.node});
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...