#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using namespace atcoder; using mint = modint998244353; #define ll long long #define LL __int128 #define MOD 998244353 #define ld long double #define INF 2251799813685248 #define rep(i, n) for (ll i = 0; i < (n); ++i) #define reps(i, l, r) for(ll i = (l); i < (r); ++i) #define foreach(c, A) for(auto c:(A)) #define vall(A) (A).begin(),(A).end() #define vrall(A) (A).rbegin(),(A).rend() #define slice(A, l, r) next((A).begin(), (l)), next((A).begin(), (r)) #define vin(A) for (ll iiii = 0, szszszsz = (A).size(); iiii < szszszsz; iiii++){cin >> (A)[iiii];} #define vout(A) for (ll iiii = 0, szszszsz = (A).size(); iiii < szszszsz; iiii++){cout << (A)[iiii] << " \n"[iiii == szszszsz-1];} #define vin2d(A) for (ll iiii = 0; iiii < (A).size(); iiii++){for (ll jjjj = 0; jjjj < (A)[iiii].size(); jjjj++){cin >> (A)[iiii][jjjj];}} #define vout2d(A) for (ll iiii = 0; iiii < (A).size(); iiii++){for (ll jjjj = 0; jjjj < (A)[iiii].size(); jjjj++){cout << (A)[iiii][jjjj] << " \n"[jjjj==(A)[iiii].size()-1];}} #define encode(i,j) (((i))<<32)+(j) #define decode(v,w) ((w) ? (v)%4294967296 : (v)>>32) #define vinc(A) for (auto &vvvv : (A)){vvvv++;} #define vdec(A) for (auto &vvvv : (A)){vvvv--;} #define graphin0(C, M) int aaaa,bbbb;for (int iiii = 0; iiii < (M); iiii++){cin >> aaaa >> bbbb; (C)[aaaa].push_back(bbbb); (C)[bbbb].push_back(aaaa);} #define graphin1(C, M) int aaaa,bbbb;for (int iiii = 0; iiii < (M); iiii++){cin >> aaaa >> bbbb; (C)[aaaa-1].push_back(bbbb-1); (C)[bbbb-1].push_back(aaaa-1);} #define lsegtype(name) name::S, name::F #define lsegarg(name) name::op, name::e,name::comp, name::mapping, name::id vector pow2ll{1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,140737488355328,281474976710656,562949953421312,1125899906842624,2251799813685248,4503599627370496,9007199254740992,18014398509481984,36028797018963968,72057594037927936,144115188075855872,288230376151711744,576460752303423488,1152921504606846976,2305843009213693952,4611686018427387904}; vector pow10ll{1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000,100000000000,1000000000000,10000000000000,100000000000000,1000000000000000,10000000000000000,100000000000000000,1000000000000000000}; vector di{0,1,0,-1}; vector dj{1,0,-1,0}; istream &operator>>(istream &is, mint &i){long long t; is >> t; i = t; return is; } ostream &operator<<(ostream &os, const mint &i){ os << i.val(); return os;} template bool chmax(T &a, const T& b) { return a < b ? a = b, true : false; } template bool chmin(T &a, const T& b) { return a > b ? a = b, true : false; } unsigned int bit_length(ll n){ return n > 0 ? 64 - __builtin_clzll(n) : 0;} template T sum(vector A){ T res = 0; for (size_t i=0;i 0){ if ((n & 1) == 1){ ans *= p; ans %= m; } n >>= 1; p *= p; p %= m; } return (ll)ans; } // =============================================================================== int main(){ ios::sync_with_stdio(false); std::cin.tie(nullptr); int N, M, K; cin >> N >> M >> K; int u, v; vector> connected(N); scc_graph g(N); rep(i,M){ cin >> u >> v; u--; v--; g.add_edge(u, v); connected[u].push_back(v); } vector> scc = g.scc(); vector scc_id(N); rep(i, scc.size()){ for (int v : scc[i]){ scc_id[v] = i; } } // 条件1 頂点1が最上流の強連結成分に属すること if (scc_id[0] != 0){ cout << "No" << endl; return 0; } // 条件2 頂点1の連結成分の個数が1でないこと if (scc[0].size() == 1){ cout << "No" << endl; return 0; } // 条件3 トポソの隣接する成分間に辺が存在すること iff ハミルトンパスが存在すること for (size_t i=0;i color(N, -1); rep(i, N){ if (color[i] != -1){continue;} vector stack; stack.push_back(i); color[i] = 0; int id = scc_id[i]; bool res = true; // 二部グラフであるならば true while(!stack.empty()){ int u = stack.back(); stack.pop_back(); for (int v : connected[u]){ if (scc_id[v] == id ){ if (color[v] == -1){ color[v] = 1 - color[u]; stack.push_back(v); } else if (color[v] == color[u]){ res = false; } } } } if (res){ cout << "No" << endl; return 0; } } // 以上全ての条件を満たすなら Yes cout << "Yes" << endl; }