poj 1236

来源:互联网 发布:java关键词过滤 编辑:程序博客网 时间:2024/05/16 05:32
#include <iostream>#include <cstdio>#include <cstring>#include <string>#define N 110using 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;}

原创粉丝点击