#include<bits/stdc++.h> using namespace std; vector<int> tos[309]; int tab[309]; vector<int> nsciezka; int rem[309]; vector<int> krem; int n, m; void sciezkemam(int pos){ nsciezka.push_back(pos); for(int i=0;i<tos[pos].size();++i){ if(rem[tos[pos][i]]==1)continue; if(tab[tos[pos][i]]== tab[pos]-1){sciezkemam(tos[pos][i]);break;} } } int licz(int pos){ if(rem[pos]==1)return -1; if(tab[pos]!=0)return tab[pos]; for(int i=0;i<tos[pos].size();++i){ tab[pos]=max(tab[pos], licz(tos[pos][i])+1); } return tab[pos]; } vector<int> findsciezka(){ int mdl=-1; int pos=0; for(int i=1;i<=n;++i)tab[i]=0; for(int i=1;i<=n;++i){ if(rem[i]==1)continue; int temp=licz(i); if(temp>mdl){ pos=i; mdl=temp; } } nsciezka.clear(); if(pos!=0)sciezkemam(pos); return nsciezka; } int dfs(int k){ int ret=1000; vector<int> sciezka = findsciezka();//cerr<<sciezka.size()<<endl; //for(int i=0;i<sciezka.size();++i)cerr<<sciezka[i]<<" "; //cerr<<endl; //for(int i=0;i<krem.size();++i)cerr<<krem[i]<<" "; //cerr<<"\n\n"; if(k == 0)return sciezka.size(); for(int i=0;i<sciezka.size();++i){ krem.push_back(sciezka[i]); rem[sciezka[i]]=1; ret=min(ret, dfs(k-1)); rem[sciezka[i]]=0; krem.pop_back(); } return ret; } int main(){ ios_base::sync_with_stdio(0); int k;cin>>n>>m>>k; srand(time(0)); for(int i=0;i<m;++i){ int a, b;cin>>a>>b; tos[a].push_back(b); } cout<<dfs(k)<<endl; 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 | #include<bits/stdc++.h> using namespace std; vector<int> tos[309]; int tab[309]; vector<int> nsciezka; int rem[309]; vector<int> krem; int n, m; void sciezkemam(int pos){ nsciezka.push_back(pos); for(int i=0;i<tos[pos].size();++i){ if(rem[tos[pos][i]]==1)continue; if(tab[tos[pos][i]]== tab[pos]-1){sciezkemam(tos[pos][i]);break;} } } int licz(int pos){ if(rem[pos]==1)return -1; if(tab[pos]!=0)return tab[pos]; for(int i=0;i<tos[pos].size();++i){ tab[pos]=max(tab[pos], licz(tos[pos][i])+1); } return tab[pos]; } vector<int> findsciezka(){ int mdl=-1; int pos=0; for(int i=1;i<=n;++i)tab[i]=0; for(int i=1;i<=n;++i){ if(rem[i]==1)continue; int temp=licz(i); if(temp>mdl){ pos=i; mdl=temp; } } nsciezka.clear(); if(pos!=0)sciezkemam(pos); return nsciezka; } int dfs(int k){ int ret=1000; vector<int> sciezka = findsciezka();//cerr<<sciezka.size()<<endl; //for(int i=0;i<sciezka.size();++i)cerr<<sciezka[i]<<" "; //cerr<<endl; //for(int i=0;i<krem.size();++i)cerr<<krem[i]<<" "; //cerr<<"\n\n"; if(k == 0)return sciezka.size(); for(int i=0;i<sciezka.size();++i){ krem.push_back(sciezka[i]); rem[sciezka[i]]=1; ret=min(ret, dfs(k-1)); rem[sciezka[i]]=0; krem.pop_back(); } return ret; } int main(){ ios_base::sync_with_stdio(0); int k;cin>>n>>m>>k; srand(time(0)); for(int i=0;i<m;++i){ int a, b;cin>>a>>b; tos[a].push_back(b); } cout<<dfs(k)<<endl; return 0; } |