#include <bits/stdc++.h>
using namespace std;
const int N = 203;
int n, m, k, lenght;
bool brak[N], vis[N];
vector <int> vec[N];
vector <int> q, opcje[6];
int st[N], dl[N], pop[N];
void clr(int zm){
q.clear();
/*printf(">>%d\n",zm);
for(auto x : opcje[zm])
printf(">%d\n",x);*/
opcje[zm].clear();
for(int i=0; i<=n; i++){
vis[i]=false;
st[i]=0;
dl[i]=0;
pop[i]=0;
}
}
void cnt(){
for(int i=1; i<=n; i++){
if(!brak[i]){
for(auto u : vec[i])
st[u]++;
}
}
for(int i=1; i<=n; i++){
if(!brak[i] && st[i]==0)
q.push_back(i);
}
while(!q.empty()){
int u = q.back();
q.pop_back();
if(!vis[u] && !brak[u]){
vis[u]=true;
dl[u]=max(dl[u], 1);
for(auto v : vec[u]){
if(brak[v]) continue;
st[v]--;
if(dl[v] < dl[u]+1) pop[v]=u;
dl[v]=max(dl[v], dl[u]+1);
if(st[v]==0)
q.push_back(v);
}
}
}
}
int mxL(int zm){
int MAX=0;
for(int i=1; i<=n; i++){
if(brak[i]) dl[i]=0;
MAX=max(MAX, dl[i]);
}
for(int i=1; i<=n; i++){
if(dl[i]==MAX && !brak[i]){
//opcje[zm].push_back(i);
while(i!=0 && !brak[i]){
opcje[zm].push_back(i);
i=pop[i];
}
break;
}
}
return MAX;
}
int fun(int indx){
int res = mxL(indx);
if(indx==k) return res;
for(auto x : opcje[indx]){
brak[x]=true;
//printf(">>>%d\n",x);
cnt();
res = min(fun(indx+1), res);
brak[x]=false;
clr(indx+1);
}
return res;
}
int main(){
int ans;
scanf("%d %d %d",&n,&m, &k);
for(int i=0; i<m; i++){
int a, b;
scanf("%d %d",&a,&b);
vec[a].push_back(b);
}
cnt();
ans = fun(0);
/*for(int i=1; i<=n; i++){
printf("%d\n",dl[i]);
}
for(auto x : opcje)
printf(">%d\n",x);*/
printf("%d\n",ans);
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 101 102 103 104 | #include <bits/stdc++.h> using namespace std; const int N = 203; int n, m, k, lenght; bool brak[N], vis[N]; vector <int> vec[N]; vector <int> q, opcje[6]; int st[N], dl[N], pop[N]; void clr(int zm){ q.clear(); /*printf(">>%d\n",zm); for(auto x : opcje[zm]) printf(">%d\n",x);*/ opcje[zm].clear(); for(int i=0; i<=n; i++){ vis[i]=false; st[i]=0; dl[i]=0; pop[i]=0; } } void cnt(){ for(int i=1; i<=n; i++){ if(!brak[i]){ for(auto u : vec[i]) st[u]++; } } for(int i=1; i<=n; i++){ if(!brak[i] && st[i]==0) q.push_back(i); } while(!q.empty()){ int u = q.back(); q.pop_back(); if(!vis[u] && !brak[u]){ vis[u]=true; dl[u]=max(dl[u], 1); for(auto v : vec[u]){ if(brak[v]) continue; st[v]--; if(dl[v] < dl[u]+1) pop[v]=u; dl[v]=max(dl[v], dl[u]+1); if(st[v]==0) q.push_back(v); } } } } int mxL(int zm){ int MAX=0; for(int i=1; i<=n; i++){ if(brak[i]) dl[i]=0; MAX=max(MAX, dl[i]); } for(int i=1; i<=n; i++){ if(dl[i]==MAX && !brak[i]){ //opcje[zm].push_back(i); while(i!=0 && !brak[i]){ opcje[zm].push_back(i); i=pop[i]; } break; } } return MAX; } int fun(int indx){ int res = mxL(indx); if(indx==k) return res; for(auto x : opcje[indx]){ brak[x]=true; //printf(">>>%d\n",x); cnt(); res = min(fun(indx+1), res); brak[x]=false; clr(indx+1); } return res; } int main(){ int ans; scanf("%d %d %d",&n,&m, &k); for(int i=0; i<m; i++){ int a, b; scanf("%d %d",&a,&b); vec[a].push_back(b); } cnt(); ans = fun(0); /*for(int i=1; i<=n; i++){ printf("%d\n",dl[i]); } for(auto x : opcje) printf(">%d\n",x);*/ printf("%d\n",ans); return 0; } |
English