输入淡腾要死:纯粹模板
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<list>
using namespace std;
const int N=1005;
int father[N];
vector<int>M[N],Q[N];
bool vis[N];
int n,in[N],ance[N];
pair<int,int>num[N];
int find(int x)
{
return x==father[x]?x:father[x]=find(father[x]);
}
int a[N];
void dfs(int u)
{
ance[u]=u;
int dd=M[u].size();
for(int i=0;i<dd;i++)
{
dfs(M[u][i]);
father[M[u][i]]=u;
ance[find(u)]=u;
}
vis[u]=true;
for(int i=0;i<Q[u].size();i++)
{
if(vis[Q[u][i]])
{
a[find(Q[u][i])]++;
}
}
}
int get(){
char ch=getchar();
while(ch<'0'|| ch>'9') ch=getchar();
int x=0;
while(ch>='0' && ch<='9'){
x*=10;
x+=ch-'0';
ch=getchar();
}
return x;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<=n;i++)
{
vis[i]=false;
father[i]=i;
M[i].clear();
Q[i].clear();
in[i]=0;
a[i]=0;
}
int u,v,m;
for(int i=1;i<=n;i++)
{
//scanf("%d:(%d) ",&u,&m);
u=get();
m=get();
for(int j=1;j<=m;j++)
{
scanf("%d",&v);
M[u].push_back(v);
in[v]++;
}
}
scanf("%d",&m);
/*if(n==1)
printf("%d:%d",u,m);*/
for(int j=0;j<m;j++)
{
//scanf(" (%d %d) ",&u,&v);
u=get();v=get();
Q[u].push_back(v);
Q[v].push_back(u);
}
for(int i=1;i<=n;i++)
{
if(in[i]==0)
{
dfs(i);break;
}
}
//sort(a,a+m,cmp);
for(int j=1;j<=n;j++)
{
if(a[j]!=0)
{
printf("%d:%d\n",j,a[j]);
}
}
}
}