//除了输入有点坑,其他的没什么
#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;