#include <iostream>
#include <cstring>
using namespace std;
const int MAXN = 100+5;
int g[MAXN][MAXN], dfn[MAXN], num[MAXN] , a[MAXN][MAXN], n, m, scc, cnt;
int rd[MAXN],cd[MAXN];
void dfs(int k)
{
num[k] = 1;
for(int i=1; i<=n; i++)
if(g[k][i] && !num[i])
dfs(i);
dfn[++cnt] = k;
}
void ndfs(int k)
{
num[k] = scc;
for(int i=1; i<=n; i++)
if(g[i][k] && !num[i])
ndfs(i);
}
void kosaraju()
{
int i, j;
for(i=1; i<=n; i++)
if(!num[i])
dfs(i);
memset(num, 0, sizeof num);
for(i=n; i>=1; i--)
if(!num[dfn[i]]){
scc++;
ndfs(dfn[i]);
}
if(scc==1){cout<<1<<endl<<0<<endl;return;}
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(g[i][j])a[num[i]][num[j]]=1;
for(i=1; i<=scc; i++)
for(j=1; j<=scc; j++)
if(i!=j && a[i][j]){
rd[j]++;cd[i]++;
}
int ans1=0,ans2=0;
for(i=1; i<=scc; i++){
if(rd[i]==0)ans1++;
if(cd[i]==0)ans2++;
}
cout<<ans1<<endl;
if(ans1>ans2)ans2=ans1;
cout<<ans2<<endl;
}
int main()
{
int i, j, k;
cin>>n;
for(i=1;i<=n;i++){
while(cin>>k){
if(k==0)break;
g[i][k]=1;
}
}
kosaraju();
return 0;
}
[USACO5.3]校园网Network of Schools 强连通分量
最新推荐文章于 2022-10-08 11:25:19 发布