#include <bits/stdc++.h>
#define pb push_back
using namespace std;
template <class T> inline bool chkmin(T &a, T b){
return a > b ? a = b, true : false;
}
template <class T> inline bool chkmax(T &a, T b){
return a < b ? a = b, true : false;
}
const int N = 305, M = 405;
vector<int> adj[N], fwd[N];
bool ban[N];
int n, m, K, ans, fu[N], fd[N], len;
void solve(){
memset(fu + 1, 0, sizeof(int) * n), memset(fd + 1, 0, sizeof(int) * n), len = 0;
for (int u = 1; u <= n; ++u) if (!ban[u]) for (int v : fwd[u]) if (!ban[v]) chkmax(fu[u], fu[v] + 1);
for (int u = n; u >= 1; --u) if (!ban[u]) for (int v : adj[u]) if (!ban[v]) chkmax(fd[u], fd[v] + 1);
for (int u = 1; u <= n; ++u) if (!ban[u]) chkmax(len, fu[u] + fd[u]);
}
void getk1(){
solve();
vector<vector<pair<int, int>>> ranges(n + 1);
for (int u = 1; u <= n; ++u) if (!ban[u]) for (int v : adj[u]) if (!ban[v]) ranges[fu[u] + fd[v] + 1].emplace_back(u, v);
vector<int> dsu(n + 2);
for (int u = 1; u <= n + 1; ++u) dsu[u] = u + (int)ban[u];
function<int(int)> find = [&](int x){ return dsu[x] == x ? x : dsu[x] = find(dsu[x]); } ;
vector<int> result(n + 1);
for (int r = n; r >= 1; --r) {
for (auto edge : ranges[r]) {
for (int u = find(edge.first + 1); u < edge.second; u = find(dsu[u] = u + 1)) {
result[u] = r;
}
}
}
for (int u = 1, c = 0; u <= n; ++u) if (!ban[u]) chkmax(result[u], c), chkmax(c, fu[u]);
for (int u = n, c = 0; u >= 1; --u) if (!ban[u]) chkmax(result[u], c), chkmax(c, fd[u]);
for (int u = 1; u <= n; ++u) if (!ban[u]) chkmin(ans, result[u]);
}
vector<int> cur;
set<vector<int>> visited;
void dfs(int pos){
{
vector<int> opt = cur;
sort(opt.begin(), opt.end());
if (visited.count(opt)) return;
visited.insert(opt);
}
if (pos < K) {
vector<int> road; int u;
solve();
for (u = 1; u <= n; ++u) if (!ban[u] && fd[u] == len) break;
road.pb(u);
while (true) {
bool go = false;
for (int v : adj[u]) if (!ban[v] && fd[v] + 1 == fd[u]) {
road.pb(u = v);
go = true;
break;
}
if (!go) break;
}
for (int del : road) {
ban[del] = true, cur.push_back(del);
dfs(pos + 1);
ban[del] = false, cur.pop_back();
}
} else getk1();
}
int main(){
int i, u, v;
scanf("%d%d%d", &n, &m, &K);
for (i = 1; i <= m; ++i) scanf("%d%d", &u, &v), adj[u].pb(v), fwd[v].pb(u);
if (K >= n) puts("0");
else if (!K) solve(), printf("%d\n", len + 1);
else ans = n, dfs(1), printf("%d\n", ans + 1);
}
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 | #include <bits/stdc++.h> #define pb push_back using namespace std; template <class T> inline bool chkmin(T &a, T b){ return a > b ? a = b, true : false; } template <class T> inline bool chkmax(T &a, T b){ return a < b ? a = b, true : false; } const int N = 305, M = 405; vector<int> adj[N], fwd[N]; bool ban[N]; int n, m, K, ans, fu[N], fd[N], len; void solve(){ memset(fu + 1, 0, sizeof(int) * n), memset(fd + 1, 0, sizeof(int) * n), len = 0; for (int u = 1; u <= n; ++u) if (!ban[u]) for (int v : fwd[u]) if (!ban[v]) chkmax(fu[u], fu[v] + 1); for (int u = n; u >= 1; --u) if (!ban[u]) for (int v : adj[u]) if (!ban[v]) chkmax(fd[u], fd[v] + 1); for (int u = 1; u <= n; ++u) if (!ban[u]) chkmax(len, fu[u] + fd[u]); } void getk1(){ solve(); vector<vector<pair<int, int>>> ranges(n + 1); for (int u = 1; u <= n; ++u) if (!ban[u]) for (int v : adj[u]) if (!ban[v]) ranges[fu[u] + fd[v] + 1].emplace_back(u, v); vector<int> dsu(n + 2); for (int u = 1; u <= n + 1; ++u) dsu[u] = u + (int)ban[u]; function<int(int)> find = [&](int x){ return dsu[x] == x ? x : dsu[x] = find(dsu[x]); } ; vector<int> result(n + 1); for (int r = n; r >= 1; --r) { for (auto edge : ranges[r]) { for (int u = find(edge.first + 1); u < edge.second; u = find(dsu[u] = u + 1)) { result[u] = r; } } } for (int u = 1, c = 0; u <= n; ++u) if (!ban[u]) chkmax(result[u], c), chkmax(c, fu[u]); for (int u = n, c = 0; u >= 1; --u) if (!ban[u]) chkmax(result[u], c), chkmax(c, fd[u]); for (int u = 1; u <= n; ++u) if (!ban[u]) chkmin(ans, result[u]); } vector<int> cur; set<vector<int>> visited; void dfs(int pos){ { vector<int> opt = cur; sort(opt.begin(), opt.end()); if (visited.count(opt)) return; visited.insert(opt); } if (pos < K) { vector<int> road; int u; solve(); for (u = 1; u <= n; ++u) if (!ban[u] && fd[u] == len) break; road.pb(u); while (true) { bool go = false; for (int v : adj[u]) if (!ban[v] && fd[v] + 1 == fd[u]) { road.pb(u = v); go = true; break; } if (!go) break; } for (int del : road) { ban[del] = true, cur.push_back(del); dfs(pos + 1); ban[del] = false, cur.pop_back(); } } else getk1(); } int main(){ int i, u, v; scanf("%d%d%d", &n, &m, &K); for (i = 1; i <= m; ++i) scanf("%d%d", &u, &v), adj[u].pb(v), fwd[v].pb(u); if (K >= n) puts("0"); else if (!K) solve(), printf("%d\n", len + 1); else ans = n, dfs(1), printf("%d\n", ans + 1); } |
English