제출 #978101

#제출 시각아이디문제언어결과실행 시간메모리
978101SeenSiravitEvacuation plan (IZhO18_plan)C++14
41 / 100
4035 ms24824 KiB
#include<bits/stdc++.h>

using namespace std;

const int mxN = 1e5 + 5;

int n,m,k;
vector<pair<int,int>> g[mxN];
bool npp[mxN];

int dis[mxN];

void dijkstra_npp(){
    for(int i=1;i<=n;i++) dis[i] = INT_MAX;

    priority_queue<pair<int,int> , vector<pair<int,int>> , greater<pair<int,int>>> pq;

    for(int node=1;node<=n;node++){
        if(npp[node]){
            dis[node] = 0;
            pq.push({dis[node] , node});
        }
    }

    while(!pq.empty()){
        int u = pq.top().second;
        int w = pq.top().first;
        pq.pop();

        if(dis[u] < w) continue;

        for(auto [v , cost] : g[u] ){
            if(dis[v] > w + cost){
                dis[v] = w + cost;
                pq.push({dis[v] , v});
            }
        }
    }
}

int dis2[mxN];

void solve1(int start_node , int end_node){

    // start_node or end_node is npp
    if(npp[start_node] || npp[end_node]){
        cout<< 0 << "\n";
        return ;
    }

    // direct road
    for(auto [v , cost] : g[start_node]){
        if(v == end_node){
            cout<< min(dis[start_node] , dis[end_node]) << "\n";
            return ;
        }
    }

    for(int i=1;i<=n;i++) dis2[i] = 0;
    
    dis2[start_node] = dis[start_node];

    priority_queue<pair<int,int>> pq;
    pq.push({dis2[start_node] , start_node});

    while(!pq.empty()){
        int u = pq.top().second;
        int w = pq.top().first;
        pq.pop();

        if(dis2[u] > w) continue;
        
        if(u == end_node){
            cout<< dis2[u] << "\n";
            return ;
        }

        for(auto [v , cost] : g[u]){
            if(dis2[v] < min(w , dis[v])){
                dis2[v] = min(w , dis[v]);
                pq.push({dis2[v] , v});
            }
        }
    }

    cout<< 0 << "\n";
}

int pa[mxN];

int fp(int x){
    if(x == pa[x]) return x;
    return pa[x] = fp(pa[x]);
}

vector<pair<int,int>> edge;

void solve2(int start_node , int end_node){
    int l=0 , r = min(dis[start_node] , dis[end_node]);
    int ans = 0;

    while(l <= r){
        int mid = (l + r) / 2;

        for(int i=1;i<=n;i++) pa[i] = i;

        for(auto [u,v] : edge){
            int pa_u = fp(u) , pa_v = fp(v);
            
            if(pa_u == pa_v) continue;
            if(min(dis[u] , dis[v]) < mid) continue;

            pa[pa_v] = pa_u;

            if(fp(start_node) == fp(end_node)){
                break;
            }
        }

        if(fp(start_node) == fp(end_node)){
            ans = max(ans , mid);
            l = mid + 1;
        }else r = mid - 1;
    }

    cout<< ans << "\n";
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0);

    cin>> n >> m;

    for(int i=0;i<m;i++){
        int u,v,w;
        cin>> u >> v >> w;

        g[u].push_back({v,w});
        g[v].push_back({u,w});
    
        edge.push_back({u,v});
    }

    cin>> k;

    for(int i=1;i<=n;i++) npp[i] = false;

    for(int i=0;i<k;i++){
        int node;
        cin>> node;
        npp[node] = true;
    }

    dijkstra_npp();

    // for(int i=1;i<=n;i++) cout<< dis[i] << " ";
    // cout<< "\n";

    int q;
    cin>> q;

    while(q--){
        int start_node , end_node;
        cin>> start_node >> end_node;
        solve2(start_node , end_node);
    }

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

plan.cpp: In function 'void dijkstra_npp()':
plan.cpp:32:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   32 |         for(auto [v , cost] : g[u] ){
      |                  ^
plan.cpp: In function 'void solve1(int, int)':
plan.cpp:52:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   52 |     for(auto [v , cost] : g[start_node]){
      |              ^
plan.cpp:78:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   78 |         for(auto [v , cost] : g[u]){
      |                  ^
plan.cpp: In function 'void solve2(int, int)':
plan.cpp:107:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  107 |         for(auto [u,v] : edge){
      |                  ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...