# D. Toss a Coin to Your Graph... Đề bài : https://codeforces.com/contest/1679/problem/D Chặt nhị phân rồi còn lại là check cycle với tìm max path. Code : :::spoiler ```cpp #include<bits/stdc++.h> #define rep(i, a, b) for (int i = (a); i <= (b); ++i) #define rev(i, a, b) for (int i = (a); i >= (b); --i) #define ll long long #define pii pair<int, int> #define pli pair<long long, int> #define pb push_back #define fi first #define pii pair<int, int> #define se second #define lb long double using namespace std; const int mxn = 2e5 + 5; const ll MOD = 998244353; const ll INF = 1e9; vector<int> vec[mxn]; ll a[mxn]; bool valid[mxn]; int vis[mxn], par[mxn], len[mxn]; int n, m, k; bool dfs(int u) { vis[u] = 1; for (int v : vec[u]) if (valid[v] && vis[v] != 2) { if (vis[v] == 1) return 1; if (dfs(v)) return 1; } vis[u] = 2; return 0; } bool solve(ll val) { rep(i, 1, n) { vis[i] = valid[i] = 0; if (a[i] <= val) valid[i] = 1; } rep(i, 1, n) if (!vis[i] && dfs(i)) return 1; rep(i, 1, n) par[i]= 0; rep(u, 1, n) if (valid[u]) for(int v : vec[u]) ++par[v]; vector<int> t; rep(i, 1, n) len[i] = 0; rep(i, 1, n) if (valid[i] && par[i] == 0) t.pb(i); int res = -1; while(t.size()) { int u = t.back(); t.pop_back(); res = max(res, len[u]); for (int v : vec[u]) if (valid[v]) { if (--par[v] == 0) t.pb(v); len[v] = max(len[v], len[u] + 1); } } return (res + 1 >= k); } int main(){ //freopen("H:\\file_txt\\input.txt", "r", stdin); //freopen("H:\\file_txt\\output.txt", "w", stdout); cin >> n >> m >> k; rep(i, 1, n) scanf("%lli", &a[i]); rep(i, 1, m) { int u, v; scanf("%d%d", &u, &v); vec[u].pb(v); } ll l = 0, r = 1000000001; while(l < r) { ll mid = (l + r)>>1; if (solve(mid)) r = mid; else l = mid + 1; } if (l == 1e9 + 1) l = -1; cout << l; } ``` :::