2042868 2006-08-25 18:19:49 Accepted 1141 C++ 00:00.40 408K St.Crux 2042840 2006-08-25 17:48:34 Accepted 1141 C++ 00:03.04 848K St.Crux 一个是c,一个是c++,一样的算法。这数据读取的效率差的真多。 这题还算个简单的题。用c写时,读取的时候比较麻烦。p[n][0]表示的是该点的父节点。p[n][1]表示的是该点的层次。 #include <cstdio>#include <string> int n, m, p[1001][2], ans[1001]; int cca(int a, int b){ while(p[a][1] > p[b][1]) { a = p[a][0]; } while(p[b][1] > p[a][1]) { b = p[b][0]; } while(p[a][1]) { if(a == b) break; a = p[a][0], b = p[b][0]; } return a;} int main(){ //freopen("in.txt", "r", stdin); int i, j, x, y; char c; while(scanf ("%d", &n) == 1) { memset(ans, 0, sizeof(ans)); memset(p, 0, sizeof(p)); for (i = 0; i < n; i ++) { scanf ("%d", &x); scanf ("%c", &c); scanf ("%c", &c); m = 0; while (1) { scanf ("%c",&c); if (c >= '0' && c <= '9') m = m * 10 + (int)c - 48; else break; } scanf ("%c",&c); for(j = 0; j < m; j ++) { scanf("%d", &y); p[y][0] = x; p[y][1] = p[x][1] + 1; } } scanf ("%d\n", &m); for (i = 0; i < m; i ++) { scanf ("%c", &c); x = 0, y = 0; while (1) { scanf ("%c", &c); if ((c >= '0') && (c <= '9')) x = x * 10 + (int)c - 48; else break; } while (1) { scanf ("%c", &c); if ((c >= '0') && (c <= '9')) y = y * 10 + (int)c - 48; else break; } scanf ("%c", &c); //printf ("%d %d\n", x, y); ans[cca (x, y)] ++; } for(i = 1; i <= n; i ++) { if(ans[i]) printf ("%d:%d\n", i, ans[i]); } } return 0;}

评论