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; }
istok
array isistok
). Depth search is implemented, but many unnecessary flags are used. For example,used
not needed and besides, it can lead to erroneous results.col
may well take two values. - KaZaca