#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); } |
English