#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
using namespace std;
int n=0;
int color[200];
int dfn[200];
int low[200];
int in[200];
int out[200];
int colornum[200];
int time_cnt=0;
int color_cnt=0;
vector<int> g[200];
stack<int> q;
void tarjan(int u)
{
dfn[u]=low[u]=++time_cnt;
q.push(u);
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i];
if(!dfn[v]) {tarjan(v);low[u]=min(low[v],low[u]);}
else if (!color[v]) {low[u]=min(low[v],dfn[u]);}
}
if(dfn[u]==low[u])
{
color_cnt++;
int v;
for(;;)
{
v=q.top(),q.pop();
color[v]=color_cnt;
colornum[color_cnt]++;
if(u==v) break;
}
}
}
void solve()
{
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(color,0,sizeof(color));
memset(colornum,0,sizeof(colornum));
for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
for(int i=1;i<=n;i++)
{
for(int j=0;j<g[i].size();j++)
{
if(color[i]!=color[g[i][j]])
{
out[color[i]]++;
in[color[g[i][j]]]++;
}
}
}
int innum=0;
int outnum=0;
for(int i=1;i<=color_cnt;i++)
{
if(in[i]==0) innum++;
if(out[i]==0) outnum++;
}
cout<<innum<<endl;
cout<<max(innum,outnum)<<endl;
}
int main()
{
cin>>n;
{
for(int i=1;i<=n;i++)
{
int buf;
while(cin>>buf&&buf)
{
g[i].push_back(buf);
}
}
solve();
/*printf("the scc: \n");
for(int i=1;i<=color_cnt;i++)
cout<<in[i]<<' ';
cout<<endl;
for(int i=1;i<=color_cnt;i++)
cout<<out[i]<<' ';
cout<<endl;
printf("the color point:\n");
for(int i=1;i<=n;i++)
{
cout<<color[i]<<' ';
}
cout<<endl;
printf("the dfn point:\n");
for(int i=1;i<=n;i++)
{
cout<<dfn[i]<<' ';
}
cout<<endl;
printf("the low point:\n");
for(int i=1;i<=n;i++)
{
cout<<color[i]<<' ';
}
cout<<endl;*/
}
return 0;
}
poj1236 tarjan 模版题
最新推荐文章于 2021-07-21 17:42:32 发布