Submission #1353525

#TimeUsernameProblemLanguageResultExecution timeMemory
1353525julia_08Sopsug (EGOI23_sopsug)C++20
46 / 100
5094 ms53236 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 3e5 + 10;

int deg[MAXN];

vector<int> adj[MAXN];

set<int> p[MAXN], not_visited;

vector<pair<int, int>> edges;

bool dfs(int v, bool ans){
  
  bool ret = true;
  
  for(auto u : adj[v]){
    
    if(!not_visited.count(u)) return false;
    
    not_visited.erase(u);
    ret &= dfs(u, ans);
    
    if(ans) edges.push_back({u, v});
    
  }
  
  vector<int> to_visit;
  
  for(auto u : not_visited) if(!deg[u] && !p[v].count(u)) to_visit.push_back(u);
  
  for(auto u : to_visit) not_visited.erase(u);
  
  for(auto u : to_visit){
    ret &= dfs(u, ans);
    if(ans) edges.push_back({u, v});
  }
  
  return ret;
  
}

int main(){
  cin.tie(0)->sync_with_stdio(0);
  
  int n, m, k; cin >> n >> m >> k;
  
  while(m--){
    
    int a, b; cin >> a >> b;
    
    adj[b].push_back(a);
    deg[a] ++;
    
  }
  
  while(k--){
    
    int a, b; cin >> a >> b;
    p[b].insert(a);
    
  }
  
  for(int i=0; i<n; i++){
    if(deg[i] > 1){
      cout << "NO\n";
      return 0;
    }
  }
  
  for(int i=0; i<n; i++) not_visited.insert(i);
  
  int root = -1;
  
  for(int i=0; i<n; i++){
    if(not_visited.count(i)){
      
      not_visited.erase(i);
      dfs(i, 0);
      
      root = i;
      
    }
  }
  
  for(int i=0; i<n; i++) if(i != root) not_visited.insert(i);
  
  if(!dfs(root, 1) || !not_visited.empty()){
    cout << "NO\n";
    return 0;
  }
  
  for(auto [a, b] : edges) cout << a << " " << b << "\n";
  
  return 0;
}
#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...