#include #include int N, K; typedef struct { int dst; int used; } cluster_info; cluster_info clusters[100000]; int num_circles; int base_num; void DFS(int begin) { int dst; clusters[begin].used = 2; dst = clusters[begin].dst; if (clusters[dst].used == 2) { num_circles++; } else if (clusters[dst].used != 1) DFS(dst); clusters[begin].used = 1; } int main() { int i, j; int num; while (scanf("%d %d\n", &N, &K) == 2) { if (N == 0 && K == 0) break; for (i = 0; i < N; i++) { clusters[i].dst = i; clusters[i].used = 1; } num = 0; for (i = 0; i < K; i++) { int cnt; scanf("%d ", &cnt); for (j = 0; j < cnt; j++) { int pos; scanf("%d ", &pos); clusters[pos - 1].dst = num; clusters[pos - 1].used = 0; num++; } } #if 0 for (i = 0; i < N; i++) printf("%d ", clusters[num].dst); printf("\n"); #endif num_circles = 0; base_num = 0; for (i = 0; i < N; i++) { if (clusters[i].dst != i) base_num++; } if (base_num == 0) printf("No optimization needed.\n"); else { for (i = 0; i < N; i++) { if (clusters[i].used) continue; if (clusters[i].dst == i) continue; DFS(i); } printf("We need %d move operations.\n", num_circles + base_num); #if 0 printf("NUM of circles: %d\n", num_circles); #endif } } return 0; }