Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- mt19937_64 RNG(chrono::steady_clock::now().time_since_epoch().count());
- #define endl "\n"
- #define int long long
- #define INF (int)2e18
- #ifdef LOCAL
- #include "debug.h"
- #else
- #define debug(...)
- #define _start_
- #define _debug_
- #define _end_
- #endif
- void solve(){
- int n,m;
- cin>>n>>m;
- vector<pair<int, int>> edges;
- for(int i=0 ; i<m ; i++){
- int a, b;
- cin>>a>>b;
- edges.push_back({a, b});
- }
- set<pair<int, int>> edgest;
- vector<pair<int, int>> doubleedges;
- vector<int> indegree(n+1, 0);
- for(int i=0 ; i<m ; i++){
- int a = edges[i].first;
- int b = edges[i].second;
- indegree[b]++;
- if(edgest.find({b, a}) != edgest.end()){
- doubleedges.push_back({a, b});
- indegree[b]--;
- indegree[a]--;
- }
- edgest.insert({a, b});
- }
- debug(doubleedges)
- int ct = 0;
- for(int i=1 ; i<=n ; i++){
- if(indegree[i] > 0){
- ct++;
- }
- }
- debug(indegree)
- if(ct == n){
- cout<<"YES"<<endl;
- return;
- }
- vector<int> done(n+1, 0);
- for(int i=1 ; i<=n ; i++){
- if(indegree[i] > 0){
- done[i] = 1;
- }
- }
- vector<vector<int>> graph(n+1, vector<int>());
- for(auto edge : doubleedges){
- int u = edge.first;
- int v = edge.second;
- graph[u].push_back(v);
- graph[v].push_back(u);
- }
- vector<vector<int>> grpele;
- vector<int> color(n+1, 0);
- for(int i=1 ; i<=n ; i++){
- bool isCycle = false;
- vector<int> elements;
- function<void(int, int)> dfs = [&](int node, int parent){
- color[node] = 1;
- for(auto j : graph[node]){
- if(j == parent){
- continue;
- }
- if(color[j] == 0){
- dfs(j, node);
- }
- else if(color[j] == 1){
- isCycle = true;
- }
- }
- color[node] = 2;
- elements.push_back(node);
- };
- if(color[i] == 0){
- dfs(i, -1);
- if(isCycle){
- for(auto ele : elements){
- done[i] = 1;
- }
- }
- grpele.push_back(elements);
- }
- }
- for(auto elements : grpele){
- int check = false;
- for(auto ele : elements){
- if(indegree[ele] > 0){
- check = true;
- }
- }
- if(check){
- for(auto ele : elements){
- done[ele] = 1;
- }
- }
- }
- ct = 0;
- for(int i=1 ; i<=n ; i++){
- if(done[i]){
- ct++;
- }
- }
- if(ct == n){
- cout<<"YES"<<endl;
- return;
- }
- cout<<"NO"<<endl;
- return;
- }
- signed main(){
- _start_
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- cout.tie(0);
- _debug_
- int _t = 1;
- // cin >> _t;
- for(int _ = 1 ; _ <= _t ; _++){
- solve();
- }
- _end_
- }
Advertisement
Add Comment
Please, Sign In to add comment