#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
template<class T, class U>
ostream& operator<<(ostream& os, pair<T, U> p) {
return os << "(" << p.first << ", " << p.second << ")";
}
template<class C, class = typename C::value_type>
typename enable_if<!is_same<C, string>::value, ostream&>::type
operator<<(ostream& os, C c) {
for (auto i = c.begin(); i != c.end(); i++) {
os << " {"[i == c.begin()] << *i << ",}"[next(i) == c.end()];
}
return os;
}
#define debug(x) { cerr << #x << " = " << x << endl; }
#else
#define debug(...) {}
#endif
map<int, int> paths;
map<int, int> result;
const int N = 2000;
bool dis[N];
pair<int,pair<vector<int>, vector<int>>> dynamic(vector<vector<int>>& G) {
int n = G.size() - 1;
vector<int> dp(n + 1, 1);
vector<int> from(n + 1);
int MAX = 0;
for (int i = 1; i <= n; i ++) {
if (dis[i]) {
dp[i] = 0;
continue;
}
for (int y : G[i]) {
if (dp[y] < dp[i] + 1) {
from[y] = i;
dp[y] = dp[i] + 1;
}
}
MAX = max(MAX, dp[i]);
}
return {MAX, {dp, from}};
}
int backtrack(vector<vector<int>>& G, int k) {
auto res = dynamic(G);
if (k == 0) {
return res.first;
}
int n = G.size() - 1;
int MAX = res.first;
int MIN = n;
for (int i = 1; i <= n; i ++) {
if (res.second.first[i] == MAX) {
int x = i;
while (x != 0) {
if (not dis[i]) {
dis[x] = true;
MIN = min(MIN, backtrack(G, k - 1));
dis[x] = false;
}
x = res.second.second[x];
}
return MIN;
}
}
return -1;
}
vector<vector<int>> read_graph(int n, int m) {
vector<vector<int>> G(n + 1);
for (int i = 0; i < m; i ++) {
int a, b;
cin >> a >> b;
G[a].push_back(b);
}
return G;
}
int main() {
ios_base::sync_with_stdio(false);
int n, m, k;
cin >> n >> m >> k;
auto g = read_graph(n, m);
cout << backtrack(g, k) << "\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 | #include <bits/stdc++.h> using namespace std; #ifdef LOCAL template<class T, class U> ostream& operator<<(ostream& os, pair<T, U> p) { return os << "(" << p.first << ", " << p.second << ")"; } template<class C, class = typename C::value_type> typename enable_if<!is_same<C, string>::value, ostream&>::type operator<<(ostream& os, C c) { for (auto i = c.begin(); i != c.end(); i++) { os << " {"[i == c.begin()] << *i << ",}"[next(i) == c.end()]; } return os; } #define debug(x) { cerr << #x << " = " << x << endl; } #else #define debug(...) {} #endif map<int, int> paths; map<int, int> result; const int N = 2000; bool dis[N]; pair<int,pair<vector<int>, vector<int>>> dynamic(vector<vector<int>>& G) { int n = G.size() - 1; vector<int> dp(n + 1, 1); vector<int> from(n + 1); int MAX = 0; for (int i = 1; i <= n; i ++) { if (dis[i]) { dp[i] = 0; continue; } for (int y : G[i]) { if (dp[y] < dp[i] + 1) { from[y] = i; dp[y] = dp[i] + 1; } } MAX = max(MAX, dp[i]); } return {MAX, {dp, from}}; } int backtrack(vector<vector<int>>& G, int k) { auto res = dynamic(G); if (k == 0) { return res.first; } int n = G.size() - 1; int MAX = res.first; int MIN = n; for (int i = 1; i <= n; i ++) { if (res.second.first[i] == MAX) { int x = i; while (x != 0) { if (not dis[i]) { dis[x] = true; MIN = min(MIN, backtrack(G, k - 1)); dis[x] = false; } x = res.second.second[x]; } return MIN; } } return -1; } vector<vector<int>> read_graph(int n, int m) { vector<vector<int>> G(n + 1); for (int i = 0; i < m; i ++) { int a, b; cin >> a >> b; G[a].push_back(b); } return G; } int main() { ios_base::sync_with_stdio(false); int n, m, k; cin >> n >> m >> k; auto g = read_graph(n, m); cout << backtrack(g, k) << "\n"; } |
English