poj1236--强连通--tarjan--补强连通--最优分发

#include<stdio.h>
#include<stack>
#include<string.h>
using namespace std;
stack<int>s;
char map[110][110];
char fang[110];
int low[110];
int ru[110],chu[110],ins[110];
int n,ret,bian;
int belong[110];
void tarjan(int x)
{
	int i,j;
	fang[x]=low[x]=bian++;
	ins[x]=1;
	s.push(x);
	for(i=1;i<=n;i++)
	{
		if(map[x][i])
		{
			if(!fang[i])
			{
				tarjan(i);
				if(low[i]<low[x])
					low[x]=low[i];
			}else if(ins[i]&&low[i]<low[x])
				low[x]=low[i];
		}
		
	}
	if(low[x]==fang[x])
	{
		ret++;
		do{
			j=s.top();
			s.pop();
			ins[j]=0;
			belong[j]=ret;
		}while(j!=x);			
	}
}
int main()
{
	ret=0,bian=1;
	int i,j,c,r;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		while(scanf("%d",&j),j)
			map[i][j]=1;
	}
	for(i=1;i<=n;i++)
		if(!fang[i])
			tarjan(i);
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
			if(map[i][j]&&belong[i]!=belong[j])
			{
				chu[belong[i]]++;
				ru[belong[j]]++;
			}
	c=r=0;
	for(i=1;i<=ret;i++)
	{
		if(!ru[i])
			r++;
		if(!chu[i])
			c++;
	}
	if(c<r)
		c=r;
	if(ret==1)//忘了只有一个强连通分支的时候需要特殊考虑
		c=0;
	printf("%d\n%d\n",r,c);
	return 0;
}

你可能感兴趣的:(C++,c)