题目地址:https://ac.nowcoder.com/acm/contest/1061/A?&headNav=acm
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std;
const int N=1100,M=10000;
int ver[M],Next[M],head[N],dfn[N],low[N];
int vc[M],nc[M],hc[M];
int tc;
int Stack[N],ins[N],c[N];
vector<int> scc[N];
int n,m,tot,num,top,cnt;
void add(int x,int y)
{
ver[++tot]=y,Next[tot]=head[x],head[x]=tot;
}
void tarjan(int x)
{
dfn[x]=low[x]=++num;
Stack[++top]=x,ins[x]=1;
for(int i=head[x];i;i=Next[i])
{
if(!dfn[ver[i]])
{
tarjan(ver[i]);
low[x]=min(low[x],low[ver[i]]);
}
else if(ins[ver[i]])
low[x]=min(low[x],dfn[ver[i]]);
}
if(dfn[x]==low[x])
{
cnt++;int y;
while(x!=y)
{
y=Stack[top--],ins[y]=0;
c[y]=cnt,scc[cnt].push_back(y);
}
}
}
void add_c(int x,int y)
{
vc[++tc]=y,nc[tc]=hc[x],hc[x]=tc;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int y;
while(cin>>y&&y!=0)
{
add(i,y);
}
}
for(int i=1;i<=n;i++)
{
if(!dfn[i])
{
tarjan(i);
}
}
int p=0,q=0;
int v1[n+1],v2[n+1];
memset(v1,0,sizeof(v1));
memset(v2,0,sizeof(v2));
for(int x=1;x<=n;x++)
{
for(int i=head[x];i;i=Next[i])
{
int y=ver[i];
if(c[x]==c[y]) continue;
add_c(c[x],c[y]);
v1[c[y]]=1;
v2[c[x]]=1;
}
}
for(int i=1;i<=n;i++)
{
if(v1[i]==0) p++;
}
for(int i=1;i<=n;i++)
{
if(v2[i]==0) q++;
}
cout<<p<<endl;
cout<<max(p,q)<<endl;
return 0;
}
只过了27.27%