#include<bits/stdc++.h> using namespace std; int n ,m, k, col[309], tab[5][309], x, cross[309], prze[309]; vector<int> graf[309], graf1[309], ojcowie, spoj[309], myvec; void DFS(int u) { col[u]=1; if(graf[u].size()==0) { tab[0][u]=1; return; } for(int i=0; i<graf[u].size(); i++) { int v=graf[u][i]; if(col[v]==0) DFS(v); tab[0][u]=max(tab[0][u], tab[0][v]); } tab[0][u]++; return; } void DFSS(int u, int a) { spoj[u].push_back(a); for(int i=0; i<graf[u].size(); i++) { int v=graf[u][i]; DFSS(v,a); } return; } void upd(int st, int u) { //printf("???%d %d %d %d\n", u, graf[u].size(), cross[u], st); int v; prze[u]=x; if(graf[u].size()==0) { tab[st][u]=1; return; } if(cross[u]==1) { tab[st][u]=0; return; } tab[st][u]=0; for(int i=0; i<graf[u].size(); i++) { v=graf[u][i]; if(prze[v]!=x) upd(st,v); //printf("%d %d\n", v, tab[st][v]); tab[st][u]=max(tab[st][u], tab[st][v]); } //printf("?!?!?!?!%d\n", st); tab[st][u]++; return; } bool isgood(int a, int sr, int st) { //printf("%d %d %d\n", a, sr, st); int b=0,c=a,d,e,v,f; while(b<=sr) { x++; cross[c]=1; e=0; d=1; for(int i=0; i<graf[c].size(); i++) { v=graf[c][i]; ojcowie.push_back(v); myvec.push_back(v); //printf("--%d %d\n", v, tab[st-1][v]); if(e<tab[st-1][v]) { e=tab[st-1][v]; d=v; } } for(int i=0; i<ojcowie.size(); i++) { v=ojcowie[i]; tab[st][v]=tab[st-1][v]; } // if(c==3) // { // for(int i=1; i<=n; i++) printf("%d ", tab[1][i]); // printf("\n"); // for(int i=1; i<=n; i++) printf("%d ", cross[i]); // printf("\n"); // } //for(int i=1; i<=n; i++) printf("%d ", tab[0][i]); //printf(".\n"); for(int i=0; i<spoj[c].size(); i++) { v=spoj[c][i]; //printf("%d\n", v); upd(st,v); } //for(int i=1; i<=n; i++) printf("%d ", tab[0][i]); //printf("..\n"); for(int i=0; i<myvec.size(); i++) { v=myvec[i]; //printf("%d\n", v); upd(st,v); } //for(int i=1; i<=n; i++) printf("%d ", tab[0][i]); //printf("...\n"); //printf("?%d %d %d %d\n", b, c, d, e); for(int i=0; i<ojcowie.size(); i++) { v=ojcowie[i]; if(cross[v]==1) continue; //printf("-%d %d\n", v, tab[st][v]); if(e<tab[st][v]) { e=tab[st][v]; d=v; } } //printf("?%d %d %d %d\n", b, c, d, e); // if(c==3) // { // for(int i=1; i<=n; i++) printf("%d ", tab[1][i]); // printf("\n"); // } if(e<=sr) { cross[c]=0; for(int i=0; i<graf[c].size(); i++) { myvec.pop_back(); ojcowie.pop_back(); } return true; } if(k>st) { e=isgood(d,sr,st+1); if(e==1) { cross[c]=0; for(int i=0; i<graf[c].size(); i++) { myvec.pop_back(); ojcowie.pop_back(); } return true; } } b++; cross[c]=0; e=0; d=1; for(int i=0; i<graf[c].size(); i++) { v=graf[c][i]; if(tab[st-1][v]>e) { e=tab[st-1][v]; d=v; } } for(int i=0; i<graf[c].size(); i++) { myvec.pop_back(); ojcowie.pop_back(); } c=d; //for(int i=1; i<=n; i++) printf("%d ", tab[0][i]); //printf("\n"); } return false; } int main() { int a=1,b,c,d,naj=0,wyn=0, maks, mini, sr; scanf("%d%d%d", &n, &m, &k); for(int i=1; i<=m; i++) { scanf("%d%d", &a, &b); graf[a].push_back(b); graf1[b].push_back(a); } for(int i=1; i<=n; i++) if(graf1[i].size()==0) ojcowie.push_back(i); for(int i=1; i<=n; i++) if(graf1[i].size()==0) DFSS(i,i); for(int i=1; i<=n; i++) if(col[i]==0) DFS(i); for(int i=0; i<ojcowie.size(); i++) { if(tab[0][ojcowie[i]]>naj) { naj=tab[0][ojcowie[i]]; a=ojcowie[i]; } } if(k==0) { printf("%d", naj); return 0; } maks=naj; mini=naj/(k+1); x=1; // printf("!%d %d %d\n", mini, maks, a); // for(int i=1; i<=n; i++) printf("%d ", tab[0][i]); // printf("\n"); // for(int i=0; i<ojcowie.size(); i++) printf("%d ", ojcowie[i]); // printf("\n"); // for(int i=1; i<=n; i++) // { // printf("%d: ", i); // for(int j=0; j<spoj[i].size(); j++) printf("%d ", spoj[i][j]); // printf("\n"); // } while(mini<maks) { sr=(mini+maks)/2; //printf("~%d %d %d\n", mini, maks, sr); //for(int i=1; i<=n; i++) printf("%d ", tab[0][i]); //printf("\n"); if(isgood(a,sr,1)) maks=sr; else mini=sr+1; } printf("%d", mini); 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 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 | #include<bits/stdc++.h> using namespace std; int n ,m, k, col[309], tab[5][309], x, cross[309], prze[309]; vector<int> graf[309], graf1[309], ojcowie, spoj[309], myvec; void DFS(int u) { col[u]=1; if(graf[u].size()==0) { tab[0][u]=1; return; } for(int i=0; i<graf[u].size(); i++) { int v=graf[u][i]; if(col[v]==0) DFS(v); tab[0][u]=max(tab[0][u], tab[0][v]); } tab[0][u]++; return; } void DFSS(int u, int a) { spoj[u].push_back(a); for(int i=0; i<graf[u].size(); i++) { int v=graf[u][i]; DFSS(v,a); } return; } void upd(int st, int u) { //printf("???%d %d %d %d\n", u, graf[u].size(), cross[u], st); int v; prze[u]=x; if(graf[u].size()==0) { tab[st][u]=1; return; } if(cross[u]==1) { tab[st][u]=0; return; } tab[st][u]=0; for(int i=0; i<graf[u].size(); i++) { v=graf[u][i]; if(prze[v]!=x) upd(st,v); //printf("%d %d\n", v, tab[st][v]); tab[st][u]=max(tab[st][u], tab[st][v]); } //printf("?!?!?!?!%d\n", st); tab[st][u]++; return; } bool isgood(int a, int sr, int st) { //printf("%d %d %d\n", a, sr, st); int b=0,c=a,d,e,v,f; while(b<=sr) { x++; cross[c]=1; e=0; d=1; for(int i=0; i<graf[c].size(); i++) { v=graf[c][i]; ojcowie.push_back(v); myvec.push_back(v); //printf("--%d %d\n", v, tab[st-1][v]); if(e<tab[st-1][v]) { e=tab[st-1][v]; d=v; } } for(int i=0; i<ojcowie.size(); i++) { v=ojcowie[i]; tab[st][v]=tab[st-1][v]; } // if(c==3) // { // for(int i=1; i<=n; i++) printf("%d ", tab[1][i]); // printf("\n"); // for(int i=1; i<=n; i++) printf("%d ", cross[i]); // printf("\n"); // } //for(int i=1; i<=n; i++) printf("%d ", tab[0][i]); //printf(".\n"); for(int i=0; i<spoj[c].size(); i++) { v=spoj[c][i]; //printf("%d\n", v); upd(st,v); } //for(int i=1; i<=n; i++) printf("%d ", tab[0][i]); //printf("..\n"); for(int i=0; i<myvec.size(); i++) { v=myvec[i]; //printf("%d\n", v); upd(st,v); } //for(int i=1; i<=n; i++) printf("%d ", tab[0][i]); //printf("...\n"); //printf("?%d %d %d %d\n", b, c, d, e); for(int i=0; i<ojcowie.size(); i++) { v=ojcowie[i]; if(cross[v]==1) continue; //printf("-%d %d\n", v, tab[st][v]); if(e<tab[st][v]) { e=tab[st][v]; d=v; } } //printf("?%d %d %d %d\n", b, c, d, e); // if(c==3) // { // for(int i=1; i<=n; i++) printf("%d ", tab[1][i]); // printf("\n"); // } if(e<=sr) { cross[c]=0; for(int i=0; i<graf[c].size(); i++) { myvec.pop_back(); ojcowie.pop_back(); } return true; } if(k>st) { e=isgood(d,sr,st+1); if(e==1) { cross[c]=0; for(int i=0; i<graf[c].size(); i++) { myvec.pop_back(); ojcowie.pop_back(); } return true; } } b++; cross[c]=0; e=0; d=1; for(int i=0; i<graf[c].size(); i++) { v=graf[c][i]; if(tab[st-1][v]>e) { e=tab[st-1][v]; d=v; } } for(int i=0; i<graf[c].size(); i++) { myvec.pop_back(); ojcowie.pop_back(); } c=d; //for(int i=1; i<=n; i++) printf("%d ", tab[0][i]); //printf("\n"); } return false; } int main() { int a=1,b,c,d,naj=0,wyn=0, maks, mini, sr; scanf("%d%d%d", &n, &m, &k); for(int i=1; i<=m; i++) { scanf("%d%d", &a, &b); graf[a].push_back(b); graf1[b].push_back(a); } for(int i=1; i<=n; i++) if(graf1[i].size()==0) ojcowie.push_back(i); for(int i=1; i<=n; i++) if(graf1[i].size()==0) DFSS(i,i); for(int i=1; i<=n; i++) if(col[i]==0) DFS(i); for(int i=0; i<ojcowie.size(); i++) { if(tab[0][ojcowie[i]]>naj) { naj=tab[0][ojcowie[i]]; a=ojcowie[i]; } } if(k==0) { printf("%d", naj); return 0; } maks=naj; mini=naj/(k+1); x=1; // printf("!%d %d %d\n", mini, maks, a); // for(int i=1; i<=n; i++) printf("%d ", tab[0][i]); // printf("\n"); // for(int i=0; i<ojcowie.size(); i++) printf("%d ", ojcowie[i]); // printf("\n"); // for(int i=1; i<=n; i++) // { // printf("%d: ", i); // for(int j=0; j<spoj[i].size(); j++) printf("%d ", spoj[i][j]); // printf("\n"); // } while(mini<maks) { sr=(mini+maks)/2; //printf("~%d %d %d\n", mini, maks, sr); //for(int i=1; i<=n; i++) printf("%d ", tab[0][i]); //printf("\n"); if(isgood(a,sr,1)) maks=sr; else mini=sr+1; } printf("%d", mini); return 0; } |