제출 #1348158

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

using namespace std;

#define int long long
#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;

map<int,bool> mp[MAXN];
int n,m,k,pai[MAXN],root[MAXN],id[MAXN],cur,par[MAXN],obrigado[MAXN];
vector<int> rev[MAXN],cand,group[MAXN];
set<int> st;
bool ok=0;

int find(int x){
    return x==par[x]?x:par[x]=find(par[x]);
}

void join(int a,int b){
    a=find(a),b=find(b);
    if(a==b) return;
    par[b]=a;
}

void bfs(int x){
    queue<int> fila; fila.push(x);
    id[x]=++cur;
    while(!fila.empty()){
        auto i=fila.front(); fila.pop();
        group[cur].pb(i);
        vector<int> ncd;
        for(auto u:cand){
            if(u==x) continue;
            if(mp[u][i]) ncd.pb(u);
            else{
                pai[u]=i;
                fila.push(u);
            }
        }
        for(auto u:rev[i]) fila.push(u);
        cand=ncd;
    }
    if(sz(cand)==0) ok=1;
}

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,par[i]=i;
    bool da=1;
    fall(i,0,n-1) obrigado[i]=-1;
    fall(i,1,m){
        int a,b; cin>>a>>b;
        if(find(a)==find(b)){
            da=0;
        }
        if(!da) continue;
        pai[a]=b; rev[b].pb(a); obrigado[a]=1;
        join(a,b);
    }
    fall(i,1,k){
        int a,b; cin>>a>>b;
        mp[a][b]=1; 
    }
    if(!da){
        cout<<"NO\n";
        return 0;
    }
    fall(i,0,n-1) if(pai[i]==-1) cand.pb(i);
    fall(i,0,n-1){
        if(obrigado[i]!=-1) continue;
        fall(j,0,n-1) pai[i]=obrigado[i];
        cand.clear();
        fall(j,0,n-1) if(pai[j]==-1) cand.pb(j);
        bfs(i);
        if(ok) break;
    }
    if(!ok){
        cout<<"NO\n";
        return 0;
    }
    fall(i,0,n-1) if(pai[i]!=-1) cout<<i<<" "<<pai[i]<<"\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...