Beingamanforever

ICPC Camp 6 Problem B

Oct 29th, 2024
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.13 KB | None | 0 0
  1.  
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. mt19937_64 RNG(chrono::steady_clock::now().time_since_epoch().count());
  6. #define endl "\n"
  7. #define int long long
  8. #define INF (int)2e18
  9.  
  10. #ifdef LOCAL
  11.     #include "debug.h"
  12. #else
  13.     #define debug(...)
  14.     #define _start_
  15.     #define _debug_
  16.     #define _end_
  17. #endif
  18.  
  19. void solve(){
  20.     int n,m;
  21.     cin>>n>>m;
  22.     vector<pair<int, int>> edges;
  23.     for(int i=0 ; i<m ; i++){
  24.         int a, b;
  25.         cin>>a>>b;
  26.         edges.push_back({a, b});
  27.     }
  28.     set<pair<int, int>> edgest;
  29.     vector<pair<int, int>> doubleedges;
  30.     vector<int> indegree(n+1, 0);
  31.     for(int i=0 ; i<m ; i++){
  32.         int a = edges[i].first;
  33.         int b = edges[i].second;
  34.         indegree[b]++;
  35.         if(edgest.find({b, a}) != edgest.end()){
  36.             doubleedges.push_back({a, b});
  37.             indegree[b]--;
  38.             indegree[a]--;
  39.         }
  40.         edgest.insert({a, b});
  41.     }
  42.     debug(doubleedges)
  43.     int ct = 0;
  44.     for(int i=1 ; i<=n ; i++){
  45.         if(indegree[i] > 0){
  46.             ct++;
  47.         }
  48.     }
  49.     debug(indegree)
  50.     if(ct == n){
  51.         cout<<"YES"<<endl;
  52.         return;
  53.     }
  54.     vector<int> done(n+1, 0);
  55.     for(int i=1 ; i<=n ; i++){
  56.         if(indegree[i] > 0){
  57.             done[i] = 1;
  58.         }
  59.     }
  60.     vector<vector<int>> graph(n+1, vector<int>());
  61.     for(auto edge : doubleedges){
  62.         int u = edge.first;
  63.         int v = edge.second;
  64.         graph[u].push_back(v);
  65.         graph[v].push_back(u);
  66.     }
  67.     vector<vector<int>> grpele;
  68.     vector<int> color(n+1, 0);
  69.     for(int i=1 ; i<=n ; i++){
  70.         bool isCycle = false;
  71.         vector<int> elements;
  72.         function<void(int, int)> dfs = [&](int node, int parent){
  73.             color[node] = 1;
  74.             for(auto j : graph[node]){
  75.                 if(j == parent){
  76.                     continue;
  77.                 }
  78.                 if(color[j] == 0){
  79.                     dfs(j, node);
  80.                 }
  81.                 else if(color[j] == 1){
  82.                     isCycle = true;
  83.                 }
  84.             }
  85.             color[node] = 2;
  86.             elements.push_back(node);
  87.         };
  88.         if(color[i] == 0){
  89.             dfs(i, -1);
  90.             if(isCycle){
  91.                 for(auto ele : elements){
  92.                     done[i] = 1;
  93.                 }
  94.             }
  95.             grpele.push_back(elements);
  96.         }
  97.     }
  98.     for(auto elements : grpele){
  99.         int check = false;
  100.         for(auto ele : elements){
  101.             if(indegree[ele] > 0){
  102.                 check = true;
  103.             }
  104.         }
  105.         if(check){
  106.             for(auto ele : elements){
  107.                 done[ele] = 1;
  108.             }
  109.         }
  110.     }
  111.     ct = 0;
  112.     for(int i=1 ; i<=n ; i++){
  113.         if(done[i]){
  114.             ct++;
  115.         }
  116.     }
  117.     if(ct == n){
  118.         cout<<"YES"<<endl;
  119.         return;
  120.     }
  121.     cout<<"NO"<<endl;
  122.     return;
  123. }
  124.  
  125. signed main(){
  126.     _start_
  127.     ios_base::sync_with_stdio(false);
  128.     cin.tie(0);
  129.     cout.tie(0);
  130.     _debug_
  131.     int _t = 1;
  132.     // cin >> _t;
  133.     for(int  _ = 1 ;  _ <= _t ; _++){
  134.         solve();
  135.     }
  136.     _end_
  137. }
Advertisement
Add Comment
Please, Sign In to add comment