您的位置:首页 > 其它

POJ 1470 Closest Common Ancestors

2016-04-02 12:20 381 查看
输入搞得这么复杂。

#include <cstdio>
#include <iostream>
#include <vector>
#include <map>

using namespace std;
const int MAX = 1005;
int fa[MAX], r[MAX], vis[MAX], ancestor[MAX];
vector<int> tree[MAX];
vector<int> q[MAX];
map<int, int> m;
int flag[MAX];

inline void file()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
}

void init(int n)
{
for (int i = 1; i <= n; i++)
{
fa[i] = i;
r[i] = 1;
vis[i] = 0;
tree[i].clear();
q[i].clear();
ancestor[i] = i;
flag[i] = 0;
}
m.clear();
}

int find_father(int x)
{
return fa[x] == x ? x : fa[x] = find_father(fa[x]);
}

void unite(int a, int b)
{
a = find_father(a);
b = find_father(b);
if (a == b)
return ;
if (r[a] < r[b])
{
fa[a] = b;
}
else
{
fa[b] = a;
if (r[a] == r[b])
r[a]++;
}
}

void tarjan(int x)
{
int lenth = tree[x].size();
for (int i = 0; i < lenth; ++i)
{
tarjan(tree[x][i]);
unite(x, tree[x][i]);
ancestor[find_father(x)] = x;
}
vis[x] = 1;
//printf("%d ancestor is %d\n", x, ancestor[x]);
int lenth2 = q[x].size();
for (int i = 0; i < lenth2; ++i)
{
if (vis[q[x][i]])
{
//  printf("%d and %d ancestor is %d\n", x, q[x][i], ancestor[q[x][i]]);
m[ancestor[find_father(q[x][i])]]++;
}
}
}

int main()
{
int n;
// file();
while (scanf("%d", &n) != EOF)
{
init(n);
int vertic, son_num;
for (int i = 1; i <= n; ++i)
{
scanf("%d:(%d)", &vertic, &son_num);
int tmp;
for (int i = 1; i <= son_num; ++i)
{
scanf("%d", &tmp);
tree[vertic].push_back(tmp);
flag[tmp] = 1;
}
}
int q_times, a, b;
scanf("%d", &q_times);
for (int i = 0; i < q_times; ++i)
{
scanf(" (%d%d)", &a, &b);
q[a].push_back(b);
q[b].push_back(a);
}
int root;
for (int i = 1; i <= n; ++i)
{
if (!flag[i])
{
root = i;
break;
}
}
tarjan(root);
for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
{
printf("%d:%d\n", it -> first, it -> second);
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: