有向图强连通分量知识详解可以参考前面的文章(包您满意)
题目大意:N(2
#include<cstring>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
int time,n,m,x,y,ans,top,i,j,tot;
int sure[1000][1000];
int next[400005],to[400005],head[400005],dfn[400005],low[400005],cal[400005];
int in[400005],stack[400005],belong[400005],check[400005],b[400005],vis[400005],outcome[400005];
int income[400005];
void add(int x,int y)
{
tot++;
next[tot]=head[x];
to[tot]=y;
head[x]=tot;
}
void dfs(int u)
{
in[u]=1;
stack[++top]=u;
low[u]=dfn[u]=++time;
for(int now=head[u];now;now=next[now])
{
int v=to[now];
if (dfn[v]==0)
{
dfs(v);
low[u]=min(low[u],low[v]);
}
else if (in[v]==1)
{
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u])
{
int hh;
do
{
hh=stack[top--];
belong[hh]=ans;
check[ans]++;
in[hh]=0;
}while(hh!=u);
ans++;
}
}
int main()
{
scanf("%d",&n);tot=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n+1;j++)
{
scanf("%d",&m);
if (m==0) break;
add(i,m);
}
}
for(int i=1;i<=n;i++)
{
if (dfn[i]==0) dfs(i);
}
if (ans==1)
{
printf("%d\n%d",1,0);
return 0;
}
for(int i=1;i<=n;i++)
{
for(int now=head[i];now;now=next[now])
{
if (belong[i]!=belong[to[now]])
{
outcome[belong[i]]++;
income[belong[to[now]]]++;
}
}
}
int ans1=0,ans2=0;
int p;
for(int i=0;i<ans;i++)
{
if (income[i]==0)
{
ans1++;
}
if (outcome[i]==0)
ans2++;
}
printf("%d\n",ans1);
printf("%d\n",max(ans1,ans2));
return 0;
}
好了如果还有什么不懂的,可以给博主留言,或者直接加博主qq1067311025询问博主,不过博主可能是个蒟蒻,很菜。