poj 1470 Closest Common Ancestors(LCA)

来源:互联网 发布:一维数组的使用 编辑:程序博客网 时间:2024/05/09 07:07


poj 1470 Closest Common Ancestors

统计每个点成为LCA的次数

基础的LCA,但是输入好恶心啊、、、


#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;#define MAXN 905vector<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;}


0 0
原创粉丝点击