제출 #1348218

#제출 시각아이디문제언어결과실행 시간메모리
1348218settopSopsug (EGOI23_sopsug)C++20
82 / 100
5093 ms107348 KiB
#include<bits/stdc++.h>

using namespace std;

#define fall(i,a,b) for(int i=a;i<=b;i++)
#define rfall(i,a,b) for(int i=a;i>=b;i--)
#define all(x) x.begin(),x.end()
#define sz(x) (int)x.size()
#define pb push_back
const int MAXN=3e5+10;
const int inf=1e16;

unordered_map<int,bool> mp[MAXN];
int n,m,k,pai[MAXN],cur;
vector<int> rev[MAXN],cand;
bool ok;

void bfs(int x){
    cand.clear();
    fall(i,0,n-1) if(i!=x && pai[i]==-1) cand.pb(i);
    queue<int> fila; int vs=0; fila.push(x);
    while(!fila.empty()){
        auto i=fila.front(); fila.pop();
        vs++;
        vector<int> ncd;
        for(auto u:cand){
            if(!mp[i][u]){
                pai[u]=i;
                fila.push(u);
            }
            else ncd.pb(u);
        }
        for(auto u:rev[i]) fila.push(u);
        cand=ncd;
    }
    ok=(vs==n);
}

void find_SCC(int x){
    queue<int> fila; fila.push(x);
    vector<int> reach;
    while(!fila.empty()){
        auto i=fila.front(); fila.pop();
        reach.pb(i);
        vector<int> nd;
        for(auto u:cand){
            if(!mp[i][u]) fila.push(u);
            else nd.pb(u);
        }
        cand=nd;
    }
    vector<int> scc;
    vector<int> ncand;
    for(auto u:reach){
        if(!mp[u][x]) fila.push(u);
        else ncand.pb(u);
    }
    while(!fila.empty()){
        auto a=fila.front(); fila.pop();
        scc.pb(a);
        vector<int> nc;
        for(auto u:ncand){
            if(!mp[u][a]) fila.push(u);
            else nc.pb(u);
        }
        ncand=nc;
    }
    int strong=-1;
    for(auto a:scc){
        if(strong!=-1) break;
        for(auto u:cand){
            if(!mp[u][a]){
                strong=u;
                break;
            }
        }
    }
    if(strong!=-1) find_SCC(strong);
    else{
        for(auto u:scc){
            if(pai[u]==-1){
                bfs(u);
                break;
            }
        }
    }
}

int32_t main(){
    std::ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    cin>>n>>m>>k;
    fall(i,0,n-1) pai[i]=-1;
    bool da=1;
    fall(i,1,m){
        int a,b; cin>>a>>b;
        pai[a]=b; rev[b].pb(a);
    }
    fall(i,1,k){
        int a,b; cin>>a>>b;
        mp[b][a]=1; 
    }
    fall(i,0,n-1) if(i) cand.pb(i);

    find_SCC(0);
   
    if(!ok){
        cout<<"NO\n";
        return 0;
    }
    fall(i,0,n-1) if(pai[i]!=-1) cout<<i<<" "<<pai[i]<<"\n";
}

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

Main.cpp:11:15: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+16' to '2147483647' [-Woverflow]
   11 | const int inf=1e16;
      |               ^~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...