| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
wa不知道多少次了,在ZOJ上过,在这里就是不过,求大神帮忙看看#include<iostream>
#include<stdio.h>
#include<string>
#include<memory.h>
#include<algorithm>
#include<vector>
using namespace std;
int n;
vector<int> node[5000];
int parent[5000];
int deep[5000];
long coun[5000];
int answer[1001][1001];
void DFS(int dep, int x)
{
deep[x] = dep;
for (vector<int>::iterator it = node[x].begin(); it != node[x].end(); it++)
{
int next = *it;
DFS(dep + 1, next);
}
}
int LCA(int x, int y)
{
if (answer[x][y] > 0)return answer[x][y];
if(x==y)
{
answer[x][y]=x;
answer[y][x]=answer[x][y];
return answer[x][y];
}
if (deep[x] < deep[y])
{
if (parent[y] == x)
{
answer[x][y] = x;
answer[y][x]=answer[x][y];
return x;
}
else
{
answer[x][y] = LCA(x, parent[y]);
answer[y][x]=answer[x][y];
return answer[x][y];
}
}
else if (deep[x]>deep[y])
{
if (parent[x] == y)
{
answer[x][y] = y;
answer[y][x]=answer[x][y];
return y;
}
else
{
answer[x][y] = LCA(parent[x], y);
answer[y][x]=answer[x][y];
return answer[x][y];
}
}
else
{
answer[x][y] = LCA(x, parent[y]);
answer[y][x]=answer[x][y];
return answer[x][y];
}
}
int main()
{
while(scanf("%d",&n))
{
memset(parent, 0, sizeof(parent));
for (int iiii = 1; iiii <= n; iiii++)
{
node[iiii].clear();
}
for (int iiiii = 1; iiiii <= n; iiiii++)
{
int tempnode, num, successor;
scanf("%d:(%d)", &tempnode, &num);
for (int j = 1; j <= num; j++)
{
scanf("%d",&successor);
node[tempnode].push_back(successor);
parent[successor] = tempnode;
}
}
memset(answer, 0, sizeof(answer));
int root;
for (int i = 1; i <= n; i++)
{
if (parent[i] == 0)
{
root = i;
break;
}
}
DFS(0, root);
memset(coun, 0, sizeof(coun[0])*(n + 1));
int m;
scanf("%d",&m);
for (int iii = 1; iii <= m; iii++)
{
int x, y;
while (getchar() != '(');
scanf("%d%d", &x, &y);
long res = LCA(x, y);
coun[res]++;
}
for (int ii = 1; ii <= n; ii++)
{
if (coun[ii] > 0)
{
cout << ii << ":" << coun[ii] << endl;
}
}
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator