Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4263    Accepted Submission(s): 
1510
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#include<stack>
#define MAX 50010
#define INF 0x3f3f3f
using namespace std;
struct node
{
	int beg,end,next;
}edge[MAX];
int low[MAX],dfn[MAX];
int n,m,ans;
int sccno[MAX],instack[MAX];
int dfsclock,scccnt;
vector<int>newmap[MAX];
vector<int>scc[MAX];
int head[MAX];
int in[MAX],out[MAX];
stack<int>s;
void init()
{
	ans=0;
	memset(head,-1,sizeof(head));
}
void add(int u,int v)
{
	edge[ans].beg=u;
	edge[ans].end=v;
	edge[ans].next=head[u];
	head[u]=ans++;
}
void getmap()
{
	int a,b,i;
	while(m--)
	{
		scanf("%d%d",&a,&b);
		add(a,b);
	} 
}
void tarjan(int u)
{
	int v,i,j;
	s.push(u);
	instack[u]=1;
	dfn[u]=low[u]=++dfsclock;
	for(i=head[u];i!=-1;i=edge[i].next)
	{
		v=edge[i].end;
		if(!dfn[v])
		{
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}
		else if(instack[v])
		    low[u]=min(low[u],dfn[v]);
	}
	if(dfn[u]==low[u])
	{
		scccnt++;
		while(1)
		{
			v=s.top();
			s.pop();
			instack[v]=0;
			sccno[v]=scccnt;
			if(v==u)
			break;
		}
	}
}
void find(int l,int r)
{
	memset(low,0,sizeof(low));
	memset(dfn,0,sizeof(dfn));
	memset(instack,0,sizeof(instack));
	memset(sccno,0,sizeof(sccno));
	dfsclock=scccnt=0;
	for(int i=l;i<=r;i++)
	{
		if(!dfn[i])
		    tarjan(i);
	}
}
void suodian()
{
	int i;
	for(i=1;i<=scccnt;i++)
	{
		newmap[i].clear();
		in[i]=0;out[i]=0;
	}
	for(i=0;i<ans;i++)
	{
		int u=sccno[edge[i].beg];
		int v=sccno[edge[i].end];
		if(u!=v)
		{
			newmap[u].push_back(v);
			in[v]++;
			out[u]++;
		}
	}
}
void solve()
{
	int i;
	if(scccnt==1)
	{
		printf("0\n");
		return ;
	}
	else
	{
		int inn=0;
		int outt=0;
		for(i=1;i<=scccnt;i++)
		{
			if(!in[i]) inn++;
			if(!out[i]) outt++;
		}
		printf("%d\n",max(inn,outt));
	}
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		init();
		getmap();
		find(1,n);
		suodian();
		solve();
	}
	return 0;
}
hdoj 2767 Proving Equivalences【求scc&&缩点】【求最少添加多少条边使这个图成为一个scc】
原文:http://www.cnblogs.com/tonghao/p/4820978.html