#include using namespace std; class SCC{ public: int siz = 0,name = 0,nowc = 0; vector already; vector ord,low,belong,topo; vector> Graph,cycle; stack St; void dfs(int pos){ low.at(pos) = (ord.at(pos) = name++); St.push(pos); for(auto to : Graph.at(pos)){ if(ord.at(to) == -1){ dfs(to); low.at(pos) = min(low.at(pos),low.at(to)); } else if(!already.at(to)) low.at(pos) = min(low.at(pos),ord.at(to)); } if(low.at(pos) == ord.at(pos)){ cycle.push_back({}); while(true){ int s = St.top(); St.pop(); cycle.back().push_back(s); belong.at(s) = nowc; already.at(s) = true; if(s == pos) break; } nowc++; } } void make(vector> &G){ Graph = G; siz = G.size(); ord.resize(siz,-1); low.resize(siz,1001001001); already.resize(siz); belong.resize(siz); for(int i=0; i> N >> M >> K; vector> Graph(N+N); for(int i=0; i> u >> v; u--; v--; Graph.at(u).push_back(v+N); Graph.at(u+N).push_back(v); } SCC S; S.make(Graph); int n = S.nowc; vector in(n); { vector> G(n); vector T(n,-1); for(int i=0; i Q; for(int i=0; i 2){yes = false; break;} int pos = Q.front(); Q.pop(); if(Q.size() == 1){ int pos2 = Q.front(); Q.pop(); if(S.cycle.at(pos).size() == 1 && S.cycle.at(pos2).size() == 1){ if(S.cycle.at(pos).at(0)%N == S.cycle.at(pos2).at(0)%N && inf) inf = false; else yes = false; } else yes = false; if(!yes) break; for(auto to : Graph.at(pos)) if(--in.at(to) == 0) Q.push(to); for(auto to : Graph.at(pos2)) if(--in.at(to) == 0) Q.push(to); } else{ inf = true; for(auto to : Graph.at(pos)) if(--in.at(to) == 0) Q.push(to); } } if(yes) cout << "Yes\n"; else assert(false); }