제출 #1357712

#제출 시각아이디문제언어결과실행 시간메모리
1357712sallySopsug (EGOI23_sopsug)C++20
100 / 100
425 ms107696 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), vis(mx, 0);
vector<vector<int>> must(mx), g(mx);
vector<bool> vis1(mx, false), vis2(mx, false);
set<int> s1, s2;
bool is_cycle = false;
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);
    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}); g[now].push_back(i);}
    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});
         g[now].push_back(nxt);
    }
    for(int i: temp) dfs2(i);
}
void dfs(int now) {
    if(is_cycle) return;
    vis[now] = 1;
    for(int i: g[now]) {
        if(vis[i] == 1) {
            is_cycle = true;
            return;
        }
    }
    vis[now] = 2;
}
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);
    for(int i=0; i<N; i++) {
        if(vis[i]==0 && !is_cycle) dfs(i);
    }
    if(is_cycle) {cout<<"NO"; return 0;}
    if(ans.size()!=N-1) {
        cout<<"NO";
        return 0;
    }
    for(auto [x, y]:ans) {
        cout<<x<<' '<<y<<'\n';
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…