poj 1470 Closest Common Ancestors
统计每个点成为LCA的次数
基础的LCA,但是输入好恶心啊、、、
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define MAXN 905
vector<int> t[MAXN];
vector<int> q[MAXN];
int n,m;
int fa[MAXN],cnt[MAXN];
bool vis[MAXN];
void ini()
{
for(int i=0;i<=n;i++)
{
t[i].clear();
q[i].clear();
fa[i]=i;
cnt[i]=0;
vis[i]=false;
}
}
int find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);}
void lca(int u)
{
vis[u]=true;
for(int i=0;i<q[u].size();i++)
{
int v=q[u][i];
if(vis[v])
{
//printf("%d--%d--%d\n",u,v,find(v));
cnt[find(v)]++;
}
}
for(int i=0;i<t[u].size();i++)
{
int v=t[u][i];
if(!vis[v])
{
lca(v);
fa[v]=find(u);
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
ini();
int u,v,nn;
for(int i=0;i<n;i++)
{
scanf("%d:(%d)",&u,&nn);
while(nn--)
{
scanf("%d",&v);
vis[v]=true;
t[u].push_back(v);
t[v].push_back(u);
}
}
scanf("%d",&m);
while(m--)
{
while(getchar()!='(');
scanf("%d %d",&u,&v);
while(getchar()!=')');
q[u].push_back(v);
q[v].push_back(u);
}
//找根
for(int i=1;i<=n;i++)
if(!vis[i])
{
for(int j=0;j<=n;j++) vis[j]=false;
lca(i);
break;
}
for(int i=1;i<=n;i++)
if(cnt[i]) printf("%d:%d\n",i,cnt[i]);
}
return 0;
}