Questo è da un post sul blog su Codeforces. Non riuscivo davvero a capire perché l'editorialista continui a sostenere che questo codice funziona in O ( n m )
Questo è un problema grafico, dove dovremmo trovare il numero di modi per attraversare da a a c. Nota che solo i percorsi come - > b - > c e a - > d - > c devono essere considerati. Cioè, ci dovrebbe essere una differenza di un solo nodo, tra di loro.
n è il numero di vertici, m è il numero di spigoli e nxt è l'elenco di adiacenze.
Let's iterate through all combinations of a and c just two simple nested loops in O(n^2) and find all candidates for b and d inside. To find candidates you can go through all neighbors of a and check that they are neighbors of c. Among all the candidates you should choose two junctions as b and d. So just use https://en.wikipedia.org/wiki/Combination All you need is to add to the answer , where r is the number of candidates (common neighbors of a and c). The code is:
for (int a = 0; a < n; a++) for (int c = 0; c < n; c++) if (a != c) { int r = 0; for (int b = 0; b < nxt[a].size(); b++) if (nxt[a][b] != a && nxt[a][b] != c && g[nxt[a][b]][c]) r++; result += r * (r - 1) / 2; }
It is easy to see that the total complexity is O(nm), because of sum of number of neighbors over all junctions is exactly m.
Se ci sono 3 loop coinvolti, allora come può la complessità del caso peggiore essere O ( n m )