#include <bits/stdc++.h> using namespace std; const int MAXN=3e2+10; const int inf=1e9+2137; int in[MAXN]; int dp[MAXN]; bool good[MAXN]; vector<int> vec[MAXN]; stack<int> stc; vector<int> sorted; void toposort(int n) { int node,i; for(i=1;i<=n;i++) { good[i]=true; dp[i]=1; if(in[i]==0) stc.push(i); } while(stc.empty()==false) { node=stc.top(); sorted.push_back(node); stc.pop(); for(i=0;i<vec[node].size();i++) { in[vec[node].at(i)]--; if(in[vec[node].at(i)]==0) stc.push(vec[node].at(i)); } } } int max_path() { int i,j,ans=0; for(i=0;i<sorted.size();i++) { if(good[sorted.at(i)]==true) { ans=max(ans,dp[sorted.at(i)]); for(j=0;j<vec[sorted.at(i)].size();j++) { dp[vec[sorted.at(i)].at(j)]=max(dp[vec[sorted.at(i)].at(j)],dp[sorted.at(i)]+1); } } dp[sorted.at(i)]=1; } return ans; } int solve(int last,int chosen,int k) { int ans=inf; if(chosen==k) { return max_path(); } for(int i=1;i<last;i++) { good[i]=false; ans=min(ans,solve(i,chosen+1,k)); good[i]=true; } return ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,m,i,j,l,o,a,b,k; cin>>n>>m>>k; for(i=0;i<m;i++) { cin>>a>>b; vec[a].push_back(b); in[b]++; } toposort(n); cout<<solve(n+1,0,k); }
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 | #include <bits/stdc++.h> using namespace std; const int MAXN=3e2+10; const int inf=1e9+2137; int in[MAXN]; int dp[MAXN]; bool good[MAXN]; vector<int> vec[MAXN]; stack<int> stc; vector<int> sorted; void toposort(int n) { int node,i; for(i=1;i<=n;i++) { good[i]=true; dp[i]=1; if(in[i]==0) stc.push(i); } while(stc.empty()==false) { node=stc.top(); sorted.push_back(node); stc.pop(); for(i=0;i<vec[node].size();i++) { in[vec[node].at(i)]--; if(in[vec[node].at(i)]==0) stc.push(vec[node].at(i)); } } } int max_path() { int i,j,ans=0; for(i=0;i<sorted.size();i++) { if(good[sorted.at(i)]==true) { ans=max(ans,dp[sorted.at(i)]); for(j=0;j<vec[sorted.at(i)].size();j++) { dp[vec[sorted.at(i)].at(j)]=max(dp[vec[sorted.at(i)].at(j)],dp[sorted.at(i)]+1); } } dp[sorted.at(i)]=1; } return ans; } int solve(int last,int chosen,int k) { int ans=inf; if(chosen==k) { return max_path(); } for(int i=1;i<last;i++) { good[i]=false; ans=min(ans,solve(i,chosen+1,k)); good[i]=true; } return ans; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,m,i,j,l,o,a,b,k; cin>>n>>m>>k; for(i=0;i<m;i++) { cin>>a>>b; vec[a].push_back(b); in[b]++; } toposort(n); cout<<solve(n+1,0,k); } |