Submission #1355788

#TimeUsernameProblemLanguageResultExecution timeMemory
1355788sallySopsug (EGOI23_sopsug)C++20
100 / 100
430 ms85624 KiB
#include<iostream>
#include<vector>
#include<set>
using namespace std;
typedef pair<int,int> pii;
const int mx = 3e5+5;
int N, M, K;
set<pii> no;
vector<pii> ans;
vector<int> p(mx, -1);
vector<vector<int>> must(mx);
vector<bool> vis1(mx, false), vis2(mx, false);
set<int> s1, s2;
int find(int x) {
    if(p[x] < 0) return x;
    return p[x] = find(p[x]);
}
void uni(int a, int b) {
    a = find(a);
    b = find(b);
    if(p[b]<p[a]) swap(a, b);
    p[a] += p[b];
    p[b] = a;
    return;
}
void dfs1(int now) {
    for(int i: must[now]) dfs1(i);
    auto it = s1.begin();
    vector<int> temp;
    while(it!=s1.end()) {
        int nxt = (*it);
        if(no.find({now, nxt})!=no.end()) {it++; continue;} 
        temp.push_back(nxt);
        it = s1.erase(it);
    }
    for(int i: temp) dfs1(i);
}
void dfs2(int now) {
    for(int i: must[now]) {dfs2(i); ans.push_back({i, now});}
    auto it = s2.begin();
    vector<int> temp;
    while(it!=s2.end()) {
        int nxt = (*it);
        if(no.find({now, nxt})!=no.end()) {it++; continue;} 
        temp.push_back(nxt);
        it = s2.erase(it);
        ans.push_back({nxt, now});
    }
    for(int i: temp) dfs2(i);
}
int main() {
    cin>>N>>M>>K;
    bool flag = false;
    for(int i=0; i<M; i++) {
        int a, b;
        cin>>b>>a;
        int pa = find(a);
        int pb = find(b);
        if(pa == pb) {flag = true; continue;}
        if(pb!=b) {flag = true; continue;}
        uni(pa, pb);
        vis1[b] = 1;
        vis2[b] = 1;
        must[a].push_back(b);
    }
    for(int i=0; i<K; i++) {
        int a, b;
        cin>>b>>a;
        no.insert({a, b});
    }
    if(flag) {cout<<"NO"; return 0;}
    for(int i=0; i<N; i++) {
        if(!vis1[i]) s2.insert(i), s1.insert(i);
    }
    int start;
    for(int i = 0; i < N; i++) {
        if(vis1[i]) continue;
        start = i;
        s1.erase(i);
        vis1[i] = 1;
        dfs1(i);
    }
    for(int i=0; i<N; i++) {
        if(!vis1[i]) {
            cout<<"NO";
            return 0;
        }
    }
    vis2[start] = 1;
    s2.erase(start);
    dfs2(start);
    
    if(ans.size()!=N-1) {
        cout<<"NO";
        return 0;
    }
    for(auto [x, y]:ans) {
        cout<<x<<' '<<y<<'\n';
    }
}
#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...