依然是离线的tarjan算法
不好理解啊不好理解
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<queue>
#include<vector>
#define inf 0x7fffffff
using namespace std;
#define maxv 10010
vector<int> vec1[maxv],vec2[maxv];
bool color[maxv];
int fa[maxv];
int ind[maxv];
int ans[maxv];
int find(int x)
{
if(x!=fa[x])
fa[x]=find(fa[x]);
return fa[x];
}
void uion(int x,int y)
{
fa[find(y)]=find(x);
}
void tarjan(int u)
{
int i;
for(i=0;i<vec1[u].size();i++)
{
int son=vec1[u][i];
tarjan(son);
uion(u,son);
}
color[u]=1;
for(i=0;i<vec2[u].size();i++)
{
int v=vec2[u][i];
if(color[v]==1)
ans[find(v)]++;
}
return;
}
int main()
{
int i,j,k,n,m;
while(scanf("%d",&n)==1)
{
for(i=0;i<=n;i++)
{
vec1[i].clear();
vec2[i].clear();
}
memset(color,0,sizeof(color));
memset(ans,0,sizeof(ans));
memset(ind,0,sizeof(ind));
int a,b;
for(j=0;j<n;j++)
{
scanf("%d:(%d)",&a,&m);
for(i=0;i<m;i++)
{
scanf("%d",&b);
vec1[a].push_back(b);
ind[b]++;
}
}
scanf("%d\n",&k);
for(i=0;i<k;i++)
{
scanf("(%d,%d)",&a,&b);
getchar();
vec2[a].push_back(b);
vec2[b].push_back(a);
}
for(i=0;i<=n;i++)
fa[i]=i;
for(i=1;i<=n;i++)
{
if(ind[i]==0)
{
tarjan(i);
break;
}
}
for(i=1;i<=n;i++)
{
if(ans[i]!=0)
printf("%d:%d\n",i,ans[i]);
}
}
return 0;
}