您的位置:首页 > 其它

poj 1236 (强连通)

2017-04-10 19:33 330 查看
#include<cstdio>
#include<cstring>
#define MAX_N 110
#define MAX(x,y) ((x)>(y)?(x):(y))
using namespace std;
int map[MAX_N][MAX_N],rmap[MAX_N][MAX_N],vis[MAX_N],stack[MAX_N],cmp[MAX_N];
int tot=0,n;
void dfs(int i)
{
vis[i]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&map[i][j])
dfs(j);
}
stack[tot++]=i;
}
void rdfs(int i,int k)
{
vis[i]=1;
cmp[i]=k;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&rmap[i][j])
rdfs(j,k);
}
}
int scc()
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
if(!vis[i])
dfs(i);
}
int k=1;
memset(vis,0,sizeof(vis));
for(int i=tot-1;i>=0;i--)
{
if(!vis[stack[i]])
{
vis[stack[i]]=1;
rdfs(stack[i],k++);
}
}
return k;
}
int main()
{
int j,k,in[MAX_N],out[MAX_N];
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
while(~scanf("%d",&j)&&j)
{
map[i][j]=1;
rmap[j][i]=1;
}
}
k=scc();
memset(in,0,sizeof(in));
memset(out,0,sizeof(out)) ;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(map[i][j]&&cmp[i]!=cmp[j])
{
in[cmp[j]]++;
out[cmp[i]]++;
}
}
}
int t1=0,t2=0;
for(int i=1;i<k;i++)
{
if(!in[i])
t1++;
if(!out[i])
t2++;
}
if(k==2)
printf("1\n0\n");
else
printf("%d\n%d\n",t1,MAX(t1,t2));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: