Here is the condition, you need the optimal solution of the problem! 
My solution passes 19 tests out of 20. I can give the code if needed. Tests also have everything, I can throw. I know my mistake and I know how to fix it, but if I correct it, the complexity will increase in the order of n !, which will not be permissible in this case. The general algorithm looks like this:
0) ΡΡΠΈΡΡΠ²Π°Ρ Π³ΡΠ°Ρ ΠΈ ΠΏΠ΅ΡΠ΅ΠΎΡΠΈΠ΅Π½ΡΠΈΡΡΡ Π΅Π³ΠΎ 1) Π²ΡΠ±ΠΈΡΠ°Ρ Π²ΡΠ΅ Π²Π΅ΡΡΠΈΠ½Ρ ΠΈΡΡΠΎΠΊΠΈ(Π²Π΅ΡΡΠΈΠ½Ρ Π² ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ Π²Ρ
ΠΎΠ΄ΠΈΡ Π½ΠΈ ΠΎΠ΄Π½ΠΎ ΡΠ΅Π±ΡΠΎ) 2) Π·Π°ΠΏΡΡΠΊΠ°Ρ dfs ΠΎΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΡΡΠΎΠΊΠ°, Π·Π°ΠΏΡΡΠΊ - dfs(int x, int day) - Π΄Π»Ρ ΠΈΡΡΠΎΠΊΠ° day = 0 2.1) ΠΏΡΠΎΠ²Π΅ΡΡΡ Π½Π° Π½Π°Π»ΠΈΡΠΈΠ΅ ΡΠΈΠΊΠ»Π° 2.2) Π² ΠΌΠ°ΡΡΠΈΠ² Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ Π·Π°ΠΏΠΈΡΡΠ²Π°Ρ ΡΠ°ΠΌΡΠΉ Π΄Π»ΠΈΠ½Π½ΡΠΉ ΠΏΡΡΡ = day 2.3) Π΄Π»Ρ ΡΠΌΠ΅ΠΆΠ½ΠΎΠΉ, Π·Π°ΠΊΡΡΡΠΎΠΉ, Π½Π΅ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π½ΠΎΠΉ Π²Π΅ΡΡΠΈΠ½Ρ, Π·Π°ΠΏΡΡΠΊ-dfs(v[x][i], day + 1) 3) ΠΡΠ»ΠΈ Π΅ΡΡΡ ΡΠΈΠΊΠ» ΡΠΎ Π²ΡΠ²ΠΎΠΆΡ -1 ΠΈ Π²ΡΡ
ΠΎΠΆΡ 4) ΠΈΠ½Π°ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠΆΡ ΠΏΠΎΠ΄ΡΡΠ΅Ρ Π΄Π½Π΅ΠΉ. ΠΠΎΡ Π·Π΄Π΅ΡΡ ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠ°, Π΄ΠΎΠΏΡΡΡΠΈΠΌ Π²Ρ
ΠΎΠ΄Π½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ 4 2 ΡΠΎΠ³Π΄Π° ΠΌΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»ΠΈΡ Π²Π΅ΡΡΠΈΠ½Ρ Π² ΡΠ»Π΅Π΄. ΠΏΠΎΡΡΠ΄ΠΊΠ΅ 0 1 Π΄Π΅Π½Ρ - 1 2 0 2 Π΄Π΅Π½Ρ - 3 0 3 Π΄Π΅Π½Ρ - 4 1 3 Ρ
ΠΎΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΏΡΠ°Π²ΠΈΡΡΡΡ ΠΈ Π·Π° 2 Π΄Π½Ρ Ρ.Π΅. Π²Π°ΠΆΠ΅Π½ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π²ΡΠ±ΠΎΡΠ° Π²Π΅ΡΡΠΈΠ½ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ. ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π½ΡΠΆΠ½Π° ΠΏΠ΅ΡΠ΅Π±ΠΈΡΠ°ΡΡ Π½Π°Π±ΠΎΡ Π²Π΅ΡΡΠΈΠ½ ΠΈ ΠΏΠΎΠ΄ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΊΠΎΠ»-Π²ΠΎ Π΄Π½Π΅ΠΉ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½ΠΎΠ²ΠΎΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΈ Π²ΡΠ±ΠΈΡΠ°ΡΡ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ, ΡΡΠΎ Ρ Π½Π΅ Π² ΡΠΎΡΡΠΎΡΠ½ΠΈΠΈ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈΠ· - Π·Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Here is the code:
#include <iostream> #include <cstdio> #include <vector> #define N 20 using namespace std; typedef vector<int> graph; vector<graph> v(N), g(N); int n, m, col[N], days[N]; bool used[N], f = true, istok[N], used2[N]; void dfs ( int x, int day ) { days[x] = day; used[x] = true; col[x] = 1; // open vertex for (int i = 0; i < v[x].size(); i++) if ( !used[v[x][i]] ) dfs(v[x][i], day + 1); else if ( col[v[x][i]] == 1 ) // Cycle { f = false; return; } else if ( day + 1 > days[v[x][i]] ) // new way is longer than old one dfs(v[x][i], day + 1); col[x] = 2; // close vertex } bool good ( int x ) { for (int i = 0; i < g[x].size(); i++) if ( !used[g[x][i]] ) return false; return !used[x]; } int main() { freopen("a.in", "r", stdin); freopen("a.out", "w", stdout); //vvod & init int k, x, l = 0; cin >> n >> m; for (int i = 0; i < n; i++) { cin >> k; if ( k == 0 ) istok[i] = true; // array of sources for (int j = 0; j < k; j++) { cin >> x; x--; v[x].push_back(i); g[i].push_back(x); } used[i] = false; } //solve for (int i = 0; i < n; i++) if ( istok[i] ) dfs(i, 0); for (int i = 0; i < n; i++) { if ( !used[i] ) f = false; used[i] = false; used2[i] = false; } //output if ( !f ) { cout << -1; return 0; } int s = 0, day = 0; f = true; while (f) { f = false; x = 0; for (int j = 0; j < n; j++) if ( days[j] <= day && x < m && good(j) ) { used2[j] = true; f = true; x++; } for (int j = 0; j < n; j++) used[j] = used2[j]; day++; } cout << day - 1; return 0; }
istokarray isistok). Depth search is implemented, but many unnecessary flags are used. For example,usednot needed and besides, it can lead to erroneous results.colmay well take two values. - KaZaca