简单LCA

来源:互联网 发布:我做淘宝客怎么找商家 编辑:程序博客网 时间:2024/06/07 02:49
//除了输入有点坑,其他的没什么
#include <iostream>#include<stdio.h>#include<vector>#include<string>#include<string.h>using namespace std;const int maxn=900+10;vector<int>gra[maxn],ask[maxn];int fa[maxn];int anse[maxn];bool visit[maxn];int in[maxn];int num[maxn];int find(int x){    if(fa[x]==x)        return x;    else        return fa[x]=find(fa[x]);}void un(int x,int y){    x=find(x);    y=find(y);    fa[y]=x;}void lca(int root){    anse[root]=root;    int i;    for(i=0;i<gra[root].size();i++)    {        int k=gra[root][i];        lca(k);        un(root,k);        anse[find(k)]=root;    }    visit[root]=true;    for(i=0;i<ask[root].size();i++)    {        int k=ask[root][i];        if(visit[k])        {           num[anse[find(k)]]++;           // return ;        }    }    return ;}int main(){    //freopen("in.txt","r",stdin);   // freopen("out.txt","w",stdout);    int n;    while(scanf("%d",&n)!=EOF)    {        int i;        int a,b;        for(i=1;i<=n;i++)        {            gra[i].clear();            ask[i].clear();            fa[i]=i;        }        memset(visit,0,sizeof(visit));        memset(in,0,sizeof(in));        memset(num,0 ,sizeof(num));        for(i=1;i<=n;i++)        {             scanf("%d:(%d)",&a,&b);             for(int j=1;j<=b;j++)             {                 int k;                 scanf("%d",&k);                 in[k]++;                 gra[a].push_back(k);             }        }        int m;        scanf("%d",&m);        //cout<<"m:"<<m<<endl;        for(i=1;i<=m;i++)        {            //cout<<"hah"<<i<" ";            char ch1[2],ch2[2];            scanf("%1s%d%d%1s",ch1,&a,&b,ch2);//输入有点坑            ask[a].push_back(b);            ask[b].push_back(a);        }        /*for(i=1;i<=n;i++)        {            for(int j=0;j<ask[i].size();j++)            {                cout<<ask[i][j]<<" ";            }            cout<<endl;        }*/        for(i=1;i<=n;i++)           if(in[i]==0)            break;        lca(i);        for(i=1;i<=n;i++)        {            if(num[i])            {                cout<<i<<":"<<num[i]<<endl;            }           // cout<<num[i]<<endl;        }    }   fclose(stdin);    fclose(stdout);    return 0;


0 0