#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
typedef vector<int> VI;
const int INF = 1000000009;
const LL LINF = 1000000000000000009LL;
#define FOR(i, b, e) for(int i = b; i <= e; ++i)
#define FORD(i, b, e) for(int i = b; i >= e; --i)
#define REP(i, n) FOR(i, 0, n-1)
#define REV(i, n) FORD(i, n-1, 0)
#define PB push_back
#define PP pop_back
#define MP make_pair
#define ST first
#define ND second
#define SIZE(c) (int)(c).size()
#define ALL(c) (c).begin(), (c).end()
#define DEBUG(s) s
const int N = 305;
int n, m, k, a, b;
VI g[N];
int odw[N];
int dist[N];
int res = N;
void SubsetKLex(int k, int n, void (*fun) (VI &))
{
int i, p = k;
VI A(k);
REP(x, k) A[x] = x;
if(k < n)
{
while(p)
{
fun(A);
A[k-1] == n-1 ? p-- : p = k;
if(p) FORD(i, k, p) A[i-1] = A[p-1] + i - p + 1;
}
}
if(k == n)
{
res = 0;
}
}
void solve(VI & v)
{
//~ for(int i: v) cout<<i<<" ";
//~ cout<<"\n";
FOR(i, 1, n) odw[i] = 0;
FOR(i, 1, n) dist[i] = 1;
for(auto j: v) odw[j] = 1;
FOR(i, 1, n)
{
if(!odw[i])
{
for(int j: g[i])
{
if(!odw[j])
{
dist[j] = max(dist[j], dist[i]+1);
}
}
}
}
int wyn = 0;
FOR(i, 1, n) wyn = max(wyn, dist[i]);
res = min(res, wyn);
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m>>k;
REP(i, m)
{
cin>>a>>b;
g[a].PB(b);
}
SubsetKLex(k, n, &solve);
cout<<res<<"\n";
return 0;
}
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 | #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; typedef pair<LL, LL> PLL; typedef vector<int> VI; const int INF = 1000000009; const LL LINF = 1000000000000000009LL; #define FOR(i, b, e) for(int i = b; i <= e; ++i) #define FORD(i, b, e) for(int i = b; i >= e; --i) #define REP(i, n) FOR(i, 0, n-1) #define REV(i, n) FORD(i, n-1, 0) #define PB push_back #define PP pop_back #define MP make_pair #define ST first #define ND second #define SIZE(c) (int)(c).size() #define ALL(c) (c).begin(), (c).end() #define DEBUG(s) s const int N = 305; int n, m, k, a, b; VI g[N]; int odw[N]; int dist[N]; int res = N; void SubsetKLex(int k, int n, void (*fun) (VI &)) { int i, p = k; VI A(k); REP(x, k) A[x] = x; if(k < n) { while(p) { fun(A); A[k-1] == n-1 ? p-- : p = k; if(p) FORD(i, k, p) A[i-1] = A[p-1] + i - p + 1; } } if(k == n) { res = 0; } } void solve(VI & v) { //~ for(int i: v) cout<<i<<" "; //~ cout<<"\n"; FOR(i, 1, n) odw[i] = 0; FOR(i, 1, n) dist[i] = 1; for(auto j: v) odw[j] = 1; FOR(i, 1, n) { if(!odw[i]) { for(int j: g[i]) { if(!odw[j]) { dist[j] = max(dist[j], dist[i]+1); } } } } int wyn = 0; FOR(i, 1, n) wyn = max(wyn, dist[i]); res = min(res, wyn); } int main() { ios::sync_with_stdio(0); cin.tie(0); cin>>n>>m>>k; REP(i, m) { cin>>a>>b; g[a].PB(b); } SubsetKLex(k, n, &solve); cout<<res<<"\n"; return 0; } |
English