poj 1236 (强连通)

来源:互联网 发布:辽阳有线淘宝营业厅 编辑:程序博客网 时间:2024/04/24 08:58
#include<cstdio>#include<cstring>#define MAX_N 110#define MAX(x,y) ((x)>(y)?(x):(y))using namespace std;int map[MAX_N][MAX_N],rmap[MAX_N][MAX_N],vis[MAX_N],stack[MAX_N],cmp[MAX_N];int tot=0,n;void dfs(int i){vis[i]=1;for(int j=1;j<=n;j++){if(!vis[j]&&map[i][j])dfs(j);}stack[tot++]=i;}void rdfs(int i,int k){vis[i]=1;cmp[i]=k;for(int j=1;j<=n;j++){if(!vis[j]&&rmap[i][j])rdfs(j,k);}}int scc(){memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++){if(!vis[i])dfs(i);}int k=1;memset(vis,0,sizeof(vis));for(int i=tot-1;i>=0;i--){if(!vis[stack[i]]){vis[stack[i]]=1; rdfs(stack[i],k++);    }}return k;}int main(){int j,k,in[MAX_N],out[MAX_N];scanf("%d",&n);for(int i=1;i<=n;i++){    while(~scanf("%d",&j)&&j){map[i][j]=1;rmap[j][i]=1;}}k=scc();memset(in,0,sizeof(in));memset(out,0,sizeof(out)) ;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(map[i][j]&&cmp[i]!=cmp[j]){in[cmp[j]]++;out[cmp[i]]++;}}}int t1=0,t2=0;for(int i=1;i<k;i++){if(!in[i])t1++;if(!out[i])t2++;}if(k==2)printf("1\n0\n");else printf("%d\n%d\n",t1,MAX(t1,t2));}

0 0
原创粉丝点击