#pragma region Template
#include <bits/stdc++.h>
using namespace std;
#define For(i, n) for (int i = 0; i < (n); i++)
#define ForD(i, n) for (int i = (n) - 1; i >= 0; i--)
#define SORT(x) sort(begin(x), end(x))
#define REP(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end)))
#if DEBUG
#define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
void err(istream_iterator<string>) {}
template<typename T, typename... Args>
void err(istream_iterator<string> it, T a, Args... args) {
cerr << *it << " = " << a << endl;
err(++it, args...);
}
#else
#define error(...) do {} while (0)
#endif
#define _upgrade do { ios::sync_with_stdio(0); cin.tie(0); } while (0)
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
#pragma endregion
const int N = 420;
int in_deg[N];
int best = 1<<30;
int len[N];
int go_to[N];
vector<int> G[N];
bool removed[N];
int removed_cnt;
int n, k;
int dfs(int x) {
if (len[x] != 0) return len[x];
int longest = 0;
for (int y : G[x]) {
if (removed[y]) continue;
int l = dfs(y);
if (longest < l) {
longest = l;
go_to[x] = y;
}
}
len[x] = longest + 1;
return len[x];
}
void remove_longest() {
For (i, n + 2) {
len[i] = go_to[i] = 0;
}
int longest = 0;
int which = 0;
for (int i = 1; i <= n; i++) {
if (!removed[i] && in_deg[i] == 0) {
int l = dfs(i);
if (longest < l) {
which = i;
longest = l;
}
}
}
if (removed_cnt == k) {
best = min(best, longest);
return;
}
vector<int> longest_path;
int elem = which;
while (elem != 0) {
longest_path.push_back(elem);
elem = go_to[elem];
}
for (int x : longest_path) {
removed[x] = true;
removed_cnt++;
for (int y : G[x]) {
in_deg[y]--;
}
remove_longest();
removed[x] = false;
removed_cnt--;
for (int y : G[x]) {
in_deg[y]++;
}
}
}
int main() {
_upgrade;
int m;
cin >> n >> m >> k;
For (i, m) {
int a, b;
cin >> a >> b;
in_deg[b]++;
G[a].push_back(b);
}
remove_longest();
cout << best << "\n";
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 | #pragma region Template #include <bits/stdc++.h> using namespace std; #define For(i, n) for (int i = 0; i < (n); i++) #define ForD(i, n) for (int i = (n) - 1; i >= 0; i--) #define SORT(x) sort(begin(x), end(x)) #define REP(i, begin, end) for (__typeof(end) i = (begin) - ((begin) > (end)); i != (end) - ((begin) > (end)); i += 1 - 2 * ((begin) > (end))) #if DEBUG #define error(args...) { string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); } void err(istream_iterator<string>) {} template<typename T, typename... Args> void err(istream_iterator<string> it, T a, Args... args) { cerr << *it << " = " << a << endl; err(++it, args...); } #else #define error(...) do {} while (0) #endif #define _upgrade do { ios::sync_with_stdio(0); cin.tie(0); } while (0) typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #pragma endregion const int N = 420; int in_deg[N]; int best = 1<<30; int len[N]; int go_to[N]; vector<int> G[N]; bool removed[N]; int removed_cnt; int n, k; int dfs(int x) { if (len[x] != 0) return len[x]; int longest = 0; for (int y : G[x]) { if (removed[y]) continue; int l = dfs(y); if (longest < l) { longest = l; go_to[x] = y; } } len[x] = longest + 1; return len[x]; } void remove_longest() { For (i, n + 2) { len[i] = go_to[i] = 0; } int longest = 0; int which = 0; for (int i = 1; i <= n; i++) { if (!removed[i] && in_deg[i] == 0) { int l = dfs(i); if (longest < l) { which = i; longest = l; } } } if (removed_cnt == k) { best = min(best, longest); return; } vector<int> longest_path; int elem = which; while (elem != 0) { longest_path.push_back(elem); elem = go_to[elem]; } for (int x : longest_path) { removed[x] = true; removed_cnt++; for (int y : G[x]) { in_deg[y]--; } remove_longest(); removed[x] = false; removed_cnt--; for (int y : G[x]) { in_deg[y]++; } } } int main() { _upgrade; int m; cin >> n >> m >> k; For (i, m) { int a, b; cin >> a >> b; in_deg[b]++; G[a].push_back(b); } remove_longest(); cout << best << "\n"; } |
English