#include <vector>
#include <list>
#include <map>
#include <set>
#include <string.h>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
#define LL long long
#define pi acos(-1)
#define N 110
#define INF 999999999
#define eps 1e-8
//****************************************
//学校共享软件,问1:要使每间学校都能用上,要几个copy;问2:现在只有一个软件,问至少加几条边使之在网络内流动
//poj 1236
//Author: leolin
//****************************************
int n;
bool g[N][N];
bool vis[N];
bool inStack[N];
int out[N],in[N];
int belong[N];
int low[N],dfn[N];
stack<int> st;
int t;//the number of 强连通分量
int step;
int min(int a,int b)
{
return a>b?b:a;
}
int max(int a,int b)
{
return a>b?a:b;
}
void init()
{
int i,j;
memset(g,0,sizeof(g));
memset(vis,0,sizeof(vis));
memset(belong,0,sizeof(belong));
memset(inStack,0,sizeof(inStack));
while(!st.empty())st.pop();
}
void tarjan(int u)
{
int i,j,k;
step++;
low[u]=step;
dfn[u]=step;
vis[u]=1;
inStack[u]=1;
st.push(u);
for(i=1;i<=n;i++)
{
if(g[u][i])
{
if(!vis[i])
{
tarjan(i);
low[u]=min(low[u],low[i]);
}
else
if(inStack[i])
low[u]=min(low[u],dfn[i]);
}
}
if(low[u]==dfn[u])
{
t++;
while(1)
{
int a=st.top();
st.pop();
belong[a]=t;
inStack[a]=0;
if(a==u)break;
}
}
}
void solve()
{
int i,j;
if(t==1)
{
printf("1\n0\n");
}
else
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(g[i][j] && belong[i]!=belong[j])
{
out[belong[i]]++;
in[belong[j]]++;
}
}
int ans1=0,ans2=0;
for(i=1;i<=t;i++)
{
if(in[i]==0)
ans1++;
if(out[i]==0)
ans2++;
}
printf("%d\n",ans1);
printf("%d\n",max(ans1,ans2));//输出max(ans1,ans2)
}
}
int main()
{//freopen("a.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
init();
int i,j,k;
for(i=1;i<=n;i++)
{
int a;
scanf("%d",&a);
while(a)
{
g[i][a]=1;
scanf("%d",&a);
}
}
t=0,step=0;
for(i=1;i<=n;i++)
{
if(!vis[i])
tarjan(i);
}
solve();
}
return 0;
}
poj 1236【强连通分量】
最新推荐文章于 2021-04-20 22:07:11 发布