正文

Zju 1141 Closest Common Ancestors2006-08-25 18:39:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/17879.html

分享到:

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;}

阅读(3928) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册