제출 #210229

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

using namespace std ; 

const int N = 5e5 + 7 ; 

int n , m , k , q ; 
bool bad[N] , good[N] , viz[N];
int root ;
vector<pair<int , int > > adj[N] ;
vector<int> qrs[N] , tree[N]; 
priority_queue<pair<int , int > > Q; 
int d[N] , ans[N]; 
vector<int> v ; 
vector<pair<int , int > > prs ; 

struct DSU{

    vector<int> fat ; 

    void init(int n){
        fat.resize(n + 1 ) ; 
        for(int i = 0 ; i < n ; i++){
            fat[i] = i ; 
        }
    }
    int fin(int x){
        return fat[x] = (fat[x]==x?x:fin(fat[x])) ; 
    }

    void unio(int a, int b){
        int aa = fin(a) ;
        int bb = fin(b) ; 
        if(aa!=bb){
            fat[aa] = bb  ;
        }
    }


} d1 , d2;


void dijkstra(){
    memset(d , -1 , sizeof d) ; 
    for(auto u : v){
        d[u] = 0 ; 
    }
    while(Q.size()){
        int dst = -Q.top().first ; 
        int node = Q.top().second ;
        Q.pop()  ;
        for(auto u : adj[node]){
            if(d[u.first]==-1 || dst + u.second < d[u.first]){

                d[u.first] = dst + u.second ; 
                Q.push({-d[u.first] , u.first}) ; 
            }
        }
    }
}

int B  , t , limit; 
int vis[N] ;

vector<pair<int , int > > node ; 

int dfs(int x){
    if(vis[x]==t)
     return 0 ;
    vis[x] = t ; 
    for(auto u : adj[x])
    {
        if(d[u.first] >=limit && vis[u.first] !=t)
        dfs(u.first);
    }
}
    
map<pair<int , int > , bool > mp ; 
map<pair<int , int > , int > sol ; 

int cur ; 

void dfs_lca(int x , int p ){
    viz[x] = 1 ; 
    for(auto u : qrs[x]){
        if(viz[u] && mp[{x ,u}]==0){
            int lca = d2.fin(u) ; 
            mp[{x , u}] = mp[{u , x}] = 1 ; 
            sol[{x , u}] = sol[{u , x}] = d[lca] ;
        }
    }
    for(auto u : tree[x]){
        if(u==p)
            continue ; 
        dfs_lca(u ,x ) ; 
        d2.unio(u , x) ; 
    }
}

int main(){
    cin>>n >>m; 
    for(int i = 0 ; i < m ; i++){
        int a , b, c; 
        cin>>a>>b>>c ; 
        adj[a].push_back({b , c}) ; 
        adj[b].push_back({a , c}) ; 
    }
    cin>>k ; 
    for(int i = 0 ; i <k ; i++){
        int a ; 
        cin>>a ; 
        bad[a] = 1 ; 
        v.push_back(a) ; 
        Q.push({0 , a}) ; 
    }
    dijkstra() ; 
    cin>>q ; 
    for(int i = 0 ; i < q ; i++){
        int a, b ; 
        cin>>a>>b ; 
        prs.push_back({a ,b }) ; 
        qrs[a].push_back(b) ; 
        qrs[b].push_back(a) ; 
    }
    
    for(int i = 1 ; i <=n ; i++){
        node.push_back({-d[i] , i}) ; 
    }
    sort(node.begin() , node.end()) ;
    d1.init(N) ; 
    for(auto u : node){
        int nod = u.second ; 
        int val = -u.first ; 
        int home = d1.fin(nod) ;
        good[nod] = 1 ;  
        ans[home] = val ; 

        for(auto it : adj[nod]){
            if(good[it.first]){
                int fn = d1.fin(it.first) ; 
                if(fn!=home){
                    if(ans[fn] < ans[home])
                    d1.unio(home , fn) ; 
                    else 
                    d1.unio(fn , home) ;
                    tree[fn].push_back(home) ; 
                    tree[home].push_back(fn) ;
                }

            }
        }
        root = nod ; 
    }
    d2.init(N) ; 
    dfs_lca(root , root) ; 
    for(int i = 0 ; i < q ; i++){
        cout<<sol[prs[i]]<<"\n";
    }
    return 0 ; 
}

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

plan.cpp: In function 'int dfs(int)':
plan.cpp:76:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#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...