Submission #1356543

#TimeUsernameProblemLanguageResultExecution timeMemory
1356543yyc000123Sopsug (EGOI23_sopsug)C++20
100 / 100
294 ms86524 KiB
#include<bits/stdc++.h>
using namespace std ;
#define F first
#define S second
const int N = 3e5+5 ;
int n , m , k , vis[N] , par[N] ;
vector<pair<int,int>> ans ;
vector<int> nei[N] ;
set<pair<int,int>> edge ;
set<int> st , st1 ;

int p(int k){
    if(par[k]<0) return k ;
    else return par[k]=p(par[k]) ;
}

void dfs(int node){
    vis[node]=1 ;
    for(int i:nei[node]) dfs(i) ;
    auto it=st.begin() ;
    vector<int> temp ;
    while(it!=st.end()){
        if(edge.find({node,*it})!=edge.end()) it++ ;
        else temp.push_back(*it) , it=st.erase(it) ;
    }
    for(int i:temp) dfs(i) ;
}

void dfs1(int node){
    for(int i:nei[node]) ans.push_back({node,i}) , dfs1(i) ;
    auto it=st1.begin() ;
    vector<int> temp ;
    while(it!=st1.end()){
        if(edge.find({node,*it})!=edge.end()) it++ ;
        else temp.push_back(*it) , it=st1.erase(it) ;
    }
    for(int i:temp) ans.push_back({node,i}) , dfs1(i) ;
}

int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) ;
    memset(par,-1,sizeof(par)) ;
    cin >> n >> m >> k ;
    for(int i=0 ; i<m ; i++){
        int a , b ; cin >> a >> b ;
        int pa = p(a) , pb = p(b) ;
        if(pa==pb || pa!=a){
            cout << "NO\n" ; return 0 ;
        }
        par[pb]+=par[pa] , par[pa]=pb ;
        nei[b].push_back(a) ; vis[a]=1 ;
    }
    for(int i=0 ; i<k ; i++){
        int a , b ; cin >> a >> b ;
        edge.insert({b,a}) ;
    }
    for(int i=0 ; i<n ; i++){
        if(!vis[i]) st.insert(i) ;
    }
    st1 = st ;
    int root = -1 ;
    for(int i=0 ; i<n ; i++){
        if(!vis[i]) root = i , st.erase(i) , dfs(i) ;
    }
    st1.erase(root) ;
    dfs1(root) ;
    if(ans.size()!=n-1){
        cout << "NO\n" ; return 0 ;
    }
    for(int i=0 ; i<ans.size() ; i++) cout << ans[i].S << ' ' << ans[i].F << '\n' ;
    return 0 ;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...