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;}