正文

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

阅读(3832) | 评论(0)


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

评论

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