#include <iostream> #include <vector> #include <queue> using namespace std; vector <int> krawedzie[307]; vector <int> topoKrawedzie[307]; int odpSort[307],najdluzsza[307],stopnie[307]; queue <int> Q; bool wykluczone[307]; int best = 1e9,n,m,k,licznik=1; void sortTopo(){ while(!Q.empty()){ int a = Q.front(); Q.pop(); odpSort[a]=licznik; licznik ++; for(int i=0;i<krawedzie[a].size();i++){ stopnie[krawedzie[a][i]]--; if(stopnie[krawedzie[a][i]]==0){ Q.push(krawedzie[a][i]); } } } } void findBest(int k,int start){ if(k==0){ for(int i=1;i<=n;i++){ for(int j=0;j<topoKrawedzie[i].size();j++){ if(wykluczone[i]==0 && wykluczone[topoKrawedzie[i][j]]==0){ najdluzsza[topoKrawedzie[i][j]]=max(najdluzsza[topoKrawedzie[i][j]],najdluzsza[i]+1); } } } int biggest = 0; for(int i=1;i<=n;i++){ biggest = max(biggest,najdluzsza[i]); } best = min(biggest,best); for(int i=1;i<=n;i++){ najdluzsza[i]=1; } return; } for(int i=start;i<=n;i++){ wykluczone[i]=1; findBest(k-1,i+1); wykluczone[i]=0; } } int main(){ scanf("%d%d%d",&n,&m,&k); if(k>=n){printf("0");return 0;} for(int i=0;i<m;i++){ int a,b; scanf("%d%d",&a,&b); krawedzie[a].push_back(b); stopnie[b]++; } for(int i=1;i<=n;i++){ if(stopnie[i]==0){ Q.push(i); } } sortTopo(); for(int i=1;i<=n;i++){ for(int j=0;j<krawedzie[i].size();j++){ topoKrawedzie[odpSort[i]].push_back(odpSort[krawedzie[i][j]]); } } for(int i=1;i<=n;i++){ najdluzsza[i]=1; } findBest(k,1); printf("%d",best); }
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 | #include <iostream> #include <vector> #include <queue> using namespace std; vector <int> krawedzie[307]; vector <int> topoKrawedzie[307]; int odpSort[307],najdluzsza[307],stopnie[307]; queue <int> Q; bool wykluczone[307]; int best = 1e9,n,m,k,licznik=1; void sortTopo(){ while(!Q.empty()){ int a = Q.front(); Q.pop(); odpSort[a]=licznik; licznik ++; for(int i=0;i<krawedzie[a].size();i++){ stopnie[krawedzie[a][i]]--; if(stopnie[krawedzie[a][i]]==0){ Q.push(krawedzie[a][i]); } } } } void findBest(int k,int start){ if(k==0){ for(int i=1;i<=n;i++){ for(int j=0;j<topoKrawedzie[i].size();j++){ if(wykluczone[i]==0 && wykluczone[topoKrawedzie[i][j]]==0){ najdluzsza[topoKrawedzie[i][j]]=max(najdluzsza[topoKrawedzie[i][j]],najdluzsza[i]+1); } } } int biggest = 0; for(int i=1;i<=n;i++){ biggest = max(biggest,najdluzsza[i]); } best = min(biggest,best); for(int i=1;i<=n;i++){ najdluzsza[i]=1; } return; } for(int i=start;i<=n;i++){ wykluczone[i]=1; findBest(k-1,i+1); wykluczone[i]=0; } } int main(){ scanf("%d%d%d",&n,&m,&k); if(k>=n){printf("0");return 0;} for(int i=0;i<m;i++){ int a,b; scanf("%d%d",&a,&b); krawedzie[a].push_back(b); stopnie[b]++; } for(int i=1;i<=n;i++){ if(stopnie[i]==0){ Q.push(i); } } sortTopo(); for(int i=1;i<=n;i++){ for(int j=0;j<krawedzie[i].size();j++){ topoKrawedzie[odpSort[i]].push_back(odpSort[krawedzie[i][j]]); } } for(int i=1;i<=n;i++){ najdluzsza[i]=1; } findBest(k,1); printf("%d",best); } |