#include <bits/stdc++.h> #define ll long long int #define pb push_back #define mp make_pair #define vi vector<int> #define pii pair<int,int> #define piii pair<int,pii> #define vii vector<pair<int,int> > #define st first #define nd second const int mod=1000000007; const int inf=1000000009; const long long int INF=1000000000000000009; using namespace std; vi P[305]; int k,n,m; bool Z[305],O[305]; int DP[305],S[305]; int wynik=1000; void czysc() { for(int i=1; i<=n; i++) { O[i]=false; S[i]=0; DP[i]=0; } } void dfs(int k) { if(Z[k]) return; O[k]=true; int ile=0; for(int i=0; i<P[k].size(); i++) { if(!O[P[k][i]]) { dfs(P[k][i]); } if(ile<DP[P[k][i]]) { S[k]=P[k][i]; ile=DP[P[k][i]]; } } ile++; DP[k]=ile; } vi W; void funkcja(int x) { czysc(); int maks=0; int liczba; for(int i=1; i<=n; i++) { if(!O[i]) { dfs(i); } } for(int i=1; i<=n; i++) { if(DP[i]>maks) { maks=DP[i]; liczba=i; } } wynik=min(wynik,maks); if(x==k) return; int numer=0; while(S[liczba]!=0) { W.pb(liczba); liczba=S[liczba]; numer++; } W.pb(liczba); numer++; for(int i=0;i<numer;i++) { int elo=W.back(); Z[elo]=true; funkcja(x+1); Z[elo]=false; W.pop_back(); } } int main() { scanf("%d %d %d",&n,&m,&k); for(int i=0; i<m; i++) { int a,b; scanf("%d %d",&a,&b); P[a].pb(b); } funkcja(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 95 96 97 98 99 100 101 102 103 104 105 | #include <bits/stdc++.h> #define ll long long int #define pb push_back #define mp make_pair #define vi vector<int> #define pii pair<int,int> #define piii pair<int,pii> #define vii vector<pair<int,int> > #define st first #define nd second const int mod=1000000007; const int inf=1000000009; const long long int INF=1000000000000000009; using namespace std; vi P[305]; int k,n,m; bool Z[305],O[305]; int DP[305],S[305]; int wynik=1000; void czysc() { for(int i=1; i<=n; i++) { O[i]=false; S[i]=0; DP[i]=0; } } void dfs(int k) { if(Z[k]) return; O[k]=true; int ile=0; for(int i=0; i<P[k].size(); i++) { if(!O[P[k][i]]) { dfs(P[k][i]); } if(ile<DP[P[k][i]]) { S[k]=P[k][i]; ile=DP[P[k][i]]; } } ile++; DP[k]=ile; } vi W; void funkcja(int x) { czysc(); int maks=0; int liczba; for(int i=1; i<=n; i++) { if(!O[i]) { dfs(i); } } for(int i=1; i<=n; i++) { if(DP[i]>maks) { maks=DP[i]; liczba=i; } } wynik=min(wynik,maks); if(x==k) return; int numer=0; while(S[liczba]!=0) { W.pb(liczba); liczba=S[liczba]; numer++; } W.pb(liczba); numer++; for(int i=0;i<numer;i++) { int elo=W.back(); Z[elo]=true; funkcja(x+1); Z[elo]=false; W.pop_back(); } } int main() { scanf("%d %d %d",&n,&m,&k); for(int i=0; i<m; i++) { int a,b; scanf("%d %d",&a,&b); P[a].pb(b); } funkcja(0); printf("%d",wynik); return 0; } |