#include <bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define lld long long
#define MAX 309
using namespace std;
int n,k,m,a,b,wynik=309;
vector<int> krawy[MAX];
int usy[MAX];
int odw[MAX];
int dp[MAX];
vector<int> lan[5];
int bfs(){
for(int i=n;i>=1;--i){
int maxi=0;
if(usy[i]){
dp[i]=0;
continue;
}
for(int j=0;j<krawy[i].size();++j){
if(!usy[krawy[i][j]]){
maxi=max(maxi,dp[krawy[i][j]]);
}
}
dp[i]=maxi+1;
}
}
int solve(int kk, int kto){
if(kk==k){
usy[kto]=1;
bfs();
//int pocz=0;
int maxi=0;
for(int i=1;i<=n;++i){
maxi=max(maxi,dp[i]);
}
usy[kto]=0;
wynik=min(wynik,maxi);
return maxi;
}else{
int mini=MAX;
lan[kk].clear();
int pocz=0;
int maxi=0;
usy[kto]=1;
bfs();
for(int i=1;i<=n;++i){
if(dp[i]>maxi){
maxi=dp[i];
pocz=i;
}
}
int gdz=pocz;
lan[kk].pb(pocz);
for(int i=0;i<maxi-1;++i){
for(int j=0;j<krawy[gdz].size();++j){
if(!usy[krawy[gdz][j]]&&dp[krawy[gdz][j]]==maxi-i-1){
lan[kk].pb(krawy[gdz][j]);
gdz=krawy[gdz][j];
break;
}
}
}
for(int i=0;i<lan[kk].size();++i){
mini=min(mini,solve(kk+1,lan[kk][i]));
}
usy[kto]=0;
return mini;
}
}
int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<m;++i){
scanf("%d%d",&a,&b);
krawy[a].pb(b);
}
if(k==n){
printf("0");
}else{
solve(0,0);
printf("%d",wynik);
}
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 | #include <bits/stdc++.h> #define pb push_back #define mp make_pair #define f first #define s second #define lld long long #define MAX 309 using namespace std; int n,k,m,a,b,wynik=309; vector<int> krawy[MAX]; int usy[MAX]; int odw[MAX]; int dp[MAX]; vector<int> lan[5]; int bfs(){ for(int i=n;i>=1;--i){ int maxi=0; if(usy[i]){ dp[i]=0; continue; } for(int j=0;j<krawy[i].size();++j){ if(!usy[krawy[i][j]]){ maxi=max(maxi,dp[krawy[i][j]]); } } dp[i]=maxi+1; } } int solve(int kk, int kto){ if(kk==k){ usy[kto]=1; bfs(); //int pocz=0; int maxi=0; for(int i=1;i<=n;++i){ maxi=max(maxi,dp[i]); } usy[kto]=0; wynik=min(wynik,maxi); return maxi; }else{ int mini=MAX; lan[kk].clear(); int pocz=0; int maxi=0; usy[kto]=1; bfs(); for(int i=1;i<=n;++i){ if(dp[i]>maxi){ maxi=dp[i]; pocz=i; } } int gdz=pocz; lan[kk].pb(pocz); for(int i=0;i<maxi-1;++i){ for(int j=0;j<krawy[gdz].size();++j){ if(!usy[krawy[gdz][j]]&&dp[krawy[gdz][j]]==maxi-i-1){ lan[kk].pb(krawy[gdz][j]); gdz=krawy[gdz][j]; break; } } } for(int i=0;i<lan[kk].size();++i){ mini=min(mini,solve(kk+1,lan[kk][i])); } usy[kto]=0; return mini; } } int main() { scanf("%d%d%d",&n,&m,&k); for(int i=0;i<m;++i){ scanf("%d%d",&a,&b); krawy[a].pb(b); } if(k==n){ printf("0"); }else{ solve(0,0); printf("%d",wynik); } return 0; } |
English