#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#define N 110
using namespace std;
bool map[N][N];
int s[N],s_n,low[N],stack[N],top,n,p[N];
void dfs( int u, int dfs_num, int &scc_num)
{
low[u]=++dfs_num;
s[++s_n]=u;
stack[++top]=u;
for( int i=1; i<=n; i++ )
{
if(map[u][i])
{
if(!low[i])
{
dfs(i,dfs_num,scc_num);
}
else if(p[i]==0)
{
while(low[stack[top]]>low[i])--top;
}
}
}
if( stack[top]==u )
{
top--;
scc_num++;
do
{
p[s[s_n]]=scc_num;
}while(s[s_n--]!=u);
}
return ;
}
void work()
{
int d[N],od[N],id[N],scc_num=0,dfs_num=0;
memset(d,0,sizeof(d));
memset(p,0,sizeof(p));
memset(low,0,sizeof(low));
s_n=top=0;
for( int i=1; i<=n; i++ )
{
if(0==low[i])dfs(i,dfs_num,scc_num);
}
int ans1=1,ans2=0;
memset(od,0,sizeof(od));
memset(id,0,sizeof(id));
for( int i=1; i<=n; i++ )
{
for( int j=1; j<=n;j++ )
{
if(map[i][j])
{
if(p[i]!=p[j])
od[p[i]]++,id[p[j]]++;
}
}
}
int in=0,on=0;
for( int i=1; i<=scc_num; i++ )
{
if(!id[i])in++;
if(!od[i])on++;
}
on=max(in,on);
if(scc_num==1)in=1,on=0;
printf("%d\n%d\n",in,on);
}
int main()
{
// freopen("in.txt","r",stdin);
int x;
while( ~scanf("%d",&n))
{
memset(map,false,sizeof(map));
for( int i=1; i<=n; i++ )
{
while( cin>>x,x)map[i][x]=true;
}
work();
}
return 0;
}
poj 1236
最新推荐文章于 2020-12-20 11:02:33 发布