#include <iostream> #include <vector> #include <queue> using namespace std; int maximum(int *tab, int n) { int wynik=tab[0]; for(int i=1;i<n;++i)wynik=max(wynik,tab[i]); return wynik; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n,m,k,wynik=401; cin>>n>>m>>k; vector<int> graf[n]; int wchodzace[n]; int droga[n]; bool wyrzucone[n]; for(int i=0;i<n;++i) { wchodzace[i]=0; wyrzucone[i]=false; } for(int i=0;i<m;++i) { int x,y; cin>>x>>y; y--; x--; wchodzace[y]++; graf[x].push_back(y); } if(k==0) { int wchodzace2[n]; for(int j=0;j<n;++j) { wchodzace2[j]=wchodzace[j]; droga[j]=0; } queue<int> kolejka; for(int j=0;j<n;++j)if(wchodzace2[j]==0)kolejka.push(j); while(!kolejka.empty()) { int v=kolejka.front(); kolejka.pop(); for(int j=0;j<graf[v].size();++j) { if(!wyrzucone[graf[v][j]]) { wchodzace2[graf[v][j]]--; if(wchodzace2[graf[v][j]]==0)kolejka.push(graf[v][j]); droga[graf[v][j]]=max(droga[graf[v][j]],droga[v]+1); } } } wynik=min(wynik,maximum(droga,n)); } else if(k==1) { for(int i=0;i<n;++i) { wyrzucone[i]=true; int wchodzace2[n]; for(int j=0;j<n;++j) { wchodzace2[j]=wchodzace[j]; droga[j]=0; } for(int j=0;j<graf[i].size();++j)wchodzace2[graf[i][j]]--; queue<int> kolejka; for(int j=0;j<n;++j)if(wchodzace2[j]==0&&wyrzucone[j]==false)kolejka.push(j); while(!kolejka.empty()) { int v=kolejka.front(); kolejka.pop(); for(int j=0;j<graf[v].size();++j) { if(!wyrzucone[graf[v][j]]) { wchodzace2[graf[v][j]]--; if(wchodzace2[graf[v][j]]==0)kolejka.push(graf[v][j]); droga[graf[v][j]]=max(droga[graf[v][j]],droga[v]+1); } } } wyrzucone[i]=false; wynik=min(wynik,maximum(droga,n)); } } else if(k==2) { for(int i=0;i<n;++i)for(int l=0;l<n;++l) { wyrzucone[i]=true; wyrzucone[l]=true; int wchodzace2[n]; for(int j=0;j<n;++j) { wchodzace2[j]=wchodzace[j]; droga[j]=0; } for(int j=0;j<graf[i].size();++j)wchodzace2[graf[i][j]]--; for(int j=0;j<graf[l].size();++j)if(l!=i)wchodzace2[graf[l][j]]--; queue<int> kolejka; for(int j=0;j<n;++j)if(wchodzace2[j]==0&&wyrzucone[j]==false)kolejka.push(j); while(!kolejka.empty()) { int v=kolejka.front(); kolejka.pop(); for(int j=0;j<graf[v].size();++j) { if(!wyrzucone[graf[v][j]]) { wchodzace2[graf[v][j]]--; if(wchodzace2[graf[v][j]]==0)kolejka.push(graf[v][j]); droga[graf[v][j]]=max(droga[graf[v][j]],droga[v]+1); } } } wyrzucone[i]=false; wyrzucone[l]=false; wynik=min(wynik,maximum(droga,n)); } } else if(k==3) { for(int i=0;i<n;++i)for(int l=0;l<n;++l)for(int o=0;o<n;++o) { wyrzucone[i]=true; wyrzucone[l]=true; wyrzucone[o]=true; int wchodzace2[n]; for(int j=0;j<n;++j) { wchodzace2[j]=wchodzace[j]; droga[j]=0; } for(int j=0;j<graf[i].size();++j)wchodzace2[graf[i][j]]--; for(int j=0;j<graf[l].size();++j)if(i!=l)wchodzace2[graf[l][j]]--; for(int j=0;j<graf[o].size();++j)if(i!=o&&l!=o)wchodzace2[graf[o][j]]--; queue<int> kolejka; for(int j=0;j<n;++j)if(wchodzace2[j]==0&&wyrzucone[j]==false)kolejka.push(j); while(!kolejka.empty()) { int v=kolejka.front(); kolejka.pop(); for(int j=0;j<graf[v].size();++j) { if(!wyrzucone[graf[v][j]]) { wchodzace2[graf[v][j]]--; if(wchodzace2[graf[v][j]]==0)kolejka.push(graf[v][j]); droga[graf[v][j]]=max(droga[graf[v][j]],droga[v]+1); } } } wyrzucone[i]=false; wyrzucone[l]=false; wyrzucone[o]=false; wynik=min(wynik,maximum(droga,n)); } } else { for(int i=0;i<n;++i)for(int l=0;l<n;++l)for(int o=0;o<n;++o)for(int p=0;p<n;++p) { wyrzucone[i]=true; wyrzucone[l]=true; wyrzucone[o]=true; wyrzucone[p]=true; int wchodzace2[n]; for(int j=0;j<n;++j) { wchodzace2[j]=wchodzace[j]; droga[j]=0; } for(int j=0;j<graf[i].size();++j)wchodzace2[graf[i][j]]--; for(int j=0;j<graf[l].size();++j)if(l!=i)wchodzace2[graf[l][j]]--; for(int j=0;j<graf[o].size();++j)if(o!=i&&o!=l)wchodzace2[graf[o][j]]--; for(int j=0;j<graf[p].size();++j)if(p!=i&&o!=p&&l!=p)wchodzace2[graf[p][j]]--; queue<int> kolejka; for(int j=0;j<n;++j)if(wchodzace2[j]==0&&wyrzucone[j]==false)kolejka.push(j); while(!kolejka.empty()) { int v=kolejka.front(); kolejka.pop(); for(int j=0;j<graf[v].size();++j) { if(!wyrzucone[graf[v][j]]) { wchodzace2[graf[v][j]]--; if(wchodzace2[graf[v][j]]==0)kolejka.push(graf[v][j]); droga[graf[v][j]]=max(droga[graf[v][j]],droga[v]+1); } } } wyrzucone[i]=false; wyrzucone[l]=false; wyrzucone[o]=false; wyrzucone[p]=false; wynik=min(wynik,maximum(droga,n)); } } if(wynik>0)cout<<wynik+1; else cout<<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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 | #include <iostream> #include <vector> #include <queue> using namespace std; int maximum(int *tab, int n) { int wynik=tab[0]; for(int i=1;i<n;++i)wynik=max(wynik,tab[i]); return wynik; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int n,m,k,wynik=401; cin>>n>>m>>k; vector<int> graf[n]; int wchodzace[n]; int droga[n]; bool wyrzucone[n]; for(int i=0;i<n;++i) { wchodzace[i]=0; wyrzucone[i]=false; } for(int i=0;i<m;++i) { int x,y; cin>>x>>y; y--; x--; wchodzace[y]++; graf[x].push_back(y); } if(k==0) { int wchodzace2[n]; for(int j=0;j<n;++j) { wchodzace2[j]=wchodzace[j]; droga[j]=0; } queue<int> kolejka; for(int j=0;j<n;++j)if(wchodzace2[j]==0)kolejka.push(j); while(!kolejka.empty()) { int v=kolejka.front(); kolejka.pop(); for(int j=0;j<graf[v].size();++j) { if(!wyrzucone[graf[v][j]]) { wchodzace2[graf[v][j]]--; if(wchodzace2[graf[v][j]]==0)kolejka.push(graf[v][j]); droga[graf[v][j]]=max(droga[graf[v][j]],droga[v]+1); } } } wynik=min(wynik,maximum(droga,n)); } else if(k==1) { for(int i=0;i<n;++i) { wyrzucone[i]=true; int wchodzace2[n]; for(int j=0;j<n;++j) { wchodzace2[j]=wchodzace[j]; droga[j]=0; } for(int j=0;j<graf[i].size();++j)wchodzace2[graf[i][j]]--; queue<int> kolejka; for(int j=0;j<n;++j)if(wchodzace2[j]==0&&wyrzucone[j]==false)kolejka.push(j); while(!kolejka.empty()) { int v=kolejka.front(); kolejka.pop(); for(int j=0;j<graf[v].size();++j) { if(!wyrzucone[graf[v][j]]) { wchodzace2[graf[v][j]]--; if(wchodzace2[graf[v][j]]==0)kolejka.push(graf[v][j]); droga[graf[v][j]]=max(droga[graf[v][j]],droga[v]+1); } } } wyrzucone[i]=false; wynik=min(wynik,maximum(droga,n)); } } else if(k==2) { for(int i=0;i<n;++i)for(int l=0;l<n;++l) { wyrzucone[i]=true; wyrzucone[l]=true; int wchodzace2[n]; for(int j=0;j<n;++j) { wchodzace2[j]=wchodzace[j]; droga[j]=0; } for(int j=0;j<graf[i].size();++j)wchodzace2[graf[i][j]]--; for(int j=0;j<graf[l].size();++j)if(l!=i)wchodzace2[graf[l][j]]--; queue<int> kolejka; for(int j=0;j<n;++j)if(wchodzace2[j]==0&&wyrzucone[j]==false)kolejka.push(j); while(!kolejka.empty()) { int v=kolejka.front(); kolejka.pop(); for(int j=0;j<graf[v].size();++j) { if(!wyrzucone[graf[v][j]]) { wchodzace2[graf[v][j]]--; if(wchodzace2[graf[v][j]]==0)kolejka.push(graf[v][j]); droga[graf[v][j]]=max(droga[graf[v][j]],droga[v]+1); } } } wyrzucone[i]=false; wyrzucone[l]=false; wynik=min(wynik,maximum(droga,n)); } } else if(k==3) { for(int i=0;i<n;++i)for(int l=0;l<n;++l)for(int o=0;o<n;++o) { wyrzucone[i]=true; wyrzucone[l]=true; wyrzucone[o]=true; int wchodzace2[n]; for(int j=0;j<n;++j) { wchodzace2[j]=wchodzace[j]; droga[j]=0; } for(int j=0;j<graf[i].size();++j)wchodzace2[graf[i][j]]--; for(int j=0;j<graf[l].size();++j)if(i!=l)wchodzace2[graf[l][j]]--; for(int j=0;j<graf[o].size();++j)if(i!=o&&l!=o)wchodzace2[graf[o][j]]--; queue<int> kolejka; for(int j=0;j<n;++j)if(wchodzace2[j]==0&&wyrzucone[j]==false)kolejka.push(j); while(!kolejka.empty()) { int v=kolejka.front(); kolejka.pop(); for(int j=0;j<graf[v].size();++j) { if(!wyrzucone[graf[v][j]]) { wchodzace2[graf[v][j]]--; if(wchodzace2[graf[v][j]]==0)kolejka.push(graf[v][j]); droga[graf[v][j]]=max(droga[graf[v][j]],droga[v]+1); } } } wyrzucone[i]=false; wyrzucone[l]=false; wyrzucone[o]=false; wynik=min(wynik,maximum(droga,n)); } } else { for(int i=0;i<n;++i)for(int l=0;l<n;++l)for(int o=0;o<n;++o)for(int p=0;p<n;++p) { wyrzucone[i]=true; wyrzucone[l]=true; wyrzucone[o]=true; wyrzucone[p]=true; int wchodzace2[n]; for(int j=0;j<n;++j) { wchodzace2[j]=wchodzace[j]; droga[j]=0; } for(int j=0;j<graf[i].size();++j)wchodzace2[graf[i][j]]--; for(int j=0;j<graf[l].size();++j)if(l!=i)wchodzace2[graf[l][j]]--; for(int j=0;j<graf[o].size();++j)if(o!=i&&o!=l)wchodzace2[graf[o][j]]--; for(int j=0;j<graf[p].size();++j)if(p!=i&&o!=p&&l!=p)wchodzace2[graf[p][j]]--; queue<int> kolejka; for(int j=0;j<n;++j)if(wchodzace2[j]==0&&wyrzucone[j]==false)kolejka.push(j); while(!kolejka.empty()) { int v=kolejka.front(); kolejka.pop(); for(int j=0;j<graf[v].size();++j) { if(!wyrzucone[graf[v][j]]) { wchodzace2[graf[v][j]]--; if(wchodzace2[graf[v][j]]==0)kolejka.push(graf[v][j]); droga[graf[v][j]]=max(droga[graf[v][j]],droga[v]+1); } } } wyrzucone[i]=false; wyrzucone[l]=false; wyrzucone[o]=false; wyrzucone[p]=false; wynik=min(wynik,maximum(droga,n)); } } if(wynik>0)cout<<wynik+1; else cout<<wynik; return 0; } |