제출 #1067496

#제출 시각아이디문제언어결과실행 시간메모리
1067496shidou26Commuter Pass (JOI18_commuter_pass)C++14
31 / 100
154 ms18836 KiB
#include <bits/stdc++.h>
using namespace std;

const long long inf = 0x3f3f3f3f3f3f3f3f;
const int N = (int) 1e5 + 7;
int n, m, s, t, x, y, u, v, w;
vector<pair<int, long long>> adj[N];
long long dist_s[N], dist_t[N], dist[N];
bool visited[N];

void dijkstra(int s, long long dist[]){
    memset(visited, false, sizeof visited);
    for(int i = 1; i <= n; i++){
        dist[i] = inf;
    }
    priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> pq;
    dist[s] = 0;
    pq.push({0, s});
    while(!pq.empty()){
        int u = pq.top().second;
        pq.pop();
        if(visited[u]) continue;
        visited[u] = true;
        for(int i = 0; i < (int) adj[u].size(); i++){
            int v = adj[u][i].first;
            long long w = adj[u][i].second;
            if(dist[v] > dist[u] + w){
                dist[v] = dist[u] + w;
                pq.push({dist[v], v});
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin >> n >> m >> s >> t >> x >> y;
    for(int i = 1; i <= m; i++){
        cin >> u >> v >> w;
        adj[u].push_back({v, w});
        adj[v].push_back({u, w});
    }

    dijkstra(s, dist_s);
    dijkstra(t, dist_t);

    memset(dist, 0x3f, sizeof dist);
    memset(visited, false, sizeof visited);
    priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> pq;
    pq.push({0, x});
    dist[x] = 0;

    while(!pq.empty()){
        int u = pq.top().second;
        pq.pop();
        if(visited[u]) continue;
        visited[u] = true;
        for(int i = 0; i < (int) adj[u].size(); i++){
            int v = adj[u][i].first;
            long long w = adj[u][i].second;
            if(dist_s[u] + w + dist_t[v] == dist_s[t] || dist_s[v] + w + dist_t[u] == dist_s[t]){
                if(dist[v] > dist[u]){
                    dist[v] = dist[u];
                    pq.push({dist[v], v});
                }
            }
            else{
                if(dist[v] > dist[u] + w){
                    dist[v] = dist[u] + w;
                    pq.push({dist[v], v});
                }
            }
        }
    }

    cout << dist[y] << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...