#include<cstdio>
#include<cstring>
#include<stack>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
stack<int> st;
vector<int> mp[1010];
int low[130],dfn[130],belong[130],vis[130],cnt,scc,n,in[130],out[130];
void Tarjan(int u){
vis[u] = 1;
low[u] = dfn[u] = ++cnt;
st.push(u);
for( int i = 0; i < mp[u].size(); i++){
int v = mp[u][i];
if(!dfn[v]){
Tarjan(v);
low[u] = min(low[u],low[v]);
}
else if(vis[v]){
low[u] = min(low[u],low[v]);
}
}
if(low[u] == dfn[u]){
int t;
++scc;
do
{
t = st.top();
st.pop();
vis[t] = 0;
belong[t] = scc;
}while(t != u);
}
}
void init(){
memset(vis,0,sizeof(vis));
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(belong,0,sizeof(belong));
scc = cnt = 0;
while(!st.empty()) st.pop();
}
int main(){
init();
scanf("%d",&n);
for( int i = 1; i <= n; i++){
int j;
while(scanf("%d",&j) == 1 && j){
mp[i].push_back(j);
}
}
for( int i = 1; i <= n; i++)
if(!dfn[i]) Tarjan(i);
for(int i = 1; i <= n; i++){
for(int j = 0; j < mp[i].size(); j++){
int v = mp[i][j];
if(belong[i] != belong[v]){
in[belong[v]]++;
out[belong[i]]++;
}
}
}
int t1 = 0, t2 = 0;
for( int i = 1; i <= scc; i++){
if(in[i] == 0) t1++;
if(out[i] == 0) t2++;
}
if(scc == 1) printf("1\n0\n");
else printf("%d\n%d\n",t1,max(t1,t2));
}
加边 成为强联通分量 poj 1236
最新推荐文章于 2020-11-09 21:24:47 发布