#include<cstdio>
#include<vector>
#include<stack>
#include<algorithm>
using namespace std;
const int M=110;
stack<int>s;
vector<int>a[M];
int l,index;
int cd[M],rd[M],dfn[M],low[M],kind[M],f[M][M];
bool b[M];
void tarjan(int x){
dfn[x]=low[x]=++index;
s.push(x);b[x]=1;
int i,len=a[x].size();
for(i=0;i<len;i++)
if(dfn[a[x][i]]==0){
tarjan(a[x][i]);
low[x]=min(low[x],low[a[x][i]]);
}
else if(b[a[x][i]])
low[x]=min(low[x],low[a[x][i]]);
if(dfn[x]==low[x]){
l++;
do{
i=s.top();
s.pop();
b[i]=0;
kind[i]=l;
}while(x!=i);
}
}
int main(){
int i,j,n,len,rdd,cdd;
scanf("%d",&n);
for(i=1;i<=n;i++)
while(scanf("%d",&j)&&j)
a[i].push_back(j);
for(i=1;i<=n;i++)
if(dfn[i]==0)
tarjan(i);
for(i=1;i<=n;i++){
len=a[i].size();
for(j=0;j<len;j++)
if(kind[i]!=kind[a[i][j]])
f[kind[i]][kind[a[i][j]]]=1;
}
for(i=1;i<=l;i++)
for(j=1;j<=l;j++)
if(f[i][j]){
cd[i]++;
rd[j]++;
}
rdd=cdd=0;
for(i=1;i<=l;i++){
if(cd[i]==0)cdd++;
if(rd[i]==0)rdd++;
}
printf("%d\n",rdd);
if(l==1)printf("0\n");
else printf("%d\n",max(rdd,cdd));
return 0;
}
POJ 1236 Network of Schools
最新推荐文章于 2020-12-20 11:02:33 发布