#include #include struct clu { int file; int num; clu() {} clu(int f, int n) : file(f), num(n) {} }; clu disk[100100]; int best[100100]; bool used[100100]; bool checked[100100]; int OneTask() { int N, K; scanf("%d %d", &N, &K); if(N == 0 && K == 0) return 0; //printf("S: %d, %d\n", N, K); memset(used, 0, sizeof(bool) * (N + 3)); int b = 1; for(int i = 1; i <= K; i++) { int S; scanf("%d", &S); for (int j = 1; j <= S; j++) { int cn; scanf("%d", &cn); disk[cn] = clu(i, j); best[cn] = b++; checked[cn] = false; used[cn] = true; } } //printf("---\n"); int ncykl = 0; int nbad = 0; for(int i = 1; i <= N; i++) { if(used[i]) { //printf("st: %d\n", i); checked[i] = true; int j = i; if(j == best[j]) continue; do { nbad++; used[j] = false; j = best[j]; //printf("-> %d\n", j); } while(used[j] && (j != i)); if(j == i) ncykl++; } } int x = ncykl + nbad; if(x == 0) printf("No optimization needed.\n"); else printf("We need %d move operations.\n", x); return 1; } int main() { while(OneTask()) ; return 0; }