hdu2767

#include<cstdio>
#include<cstring>
#include<iostream>


using namespace std;
const int MAXN=200010;
const int MAXM=500010;
int tot=0;

struct e{
	int u,v,w;
	int nxt;
}edge[MAXM];

int N,M;	
int head[MAXN],low[MAXN],dfn[MAXN],Stack[MAXN];
int Index,Belong[MAXN],degin[MAXN],degout[MAXN],num[MAXN];
bool Instack[MAXN];
int scc,top;
void init(){
	tot=0;
	memset(head,-1,sizeof(head));
}

void add(int u,int v,int w){
	edge[tot].u=u;
	edge[tot].v=v;
	edge[tot].w=w;
	edge[tot].nxt=head[u];
	head[u]=tot++;
}

void tarjian(int u)
{
	int v;
	low[u]=dfn[u]=++Index;
//	printf("low[%d]=%d\n",u,low[u]);
//	printf("dfn[%d]=%d\n",u,dfn[u]);
    Stack[top++]=u;
	Instack[u]=true;
	
	for (int i=head[u];i!=-1;i=edge[i].nxt)
	{
		int v=edge[i].v;
		if (!dfn[v])
		  {
		  	tarjian(v);
		  	if (low[u]>low[v]) low[u]=low[v];
		  }
		else if (Instack[v]&&low[u]>dfn[v])
		   low[u]=dfn[v];
	}
	if (low[u]==dfn[u])
	{
		scc++;
		do {
			 v=Stack[--top];
			 Instack[v]=false;
		      Belong[v]=scc;
		      num[scc]++;
			}
			while(v!=u);
	}
}

void deal(){
	memset(dfn,0,sizeof(dfn));
	memset(Instack,false,sizeof(Instack));
	top=Index=scc=0;
	memset(num,0,sizeof(num));
	memset(degin,0,sizeof(degin));
	memset(degout,0,sizeof(degout));
	for (int i=1;i<=N;i++)
	   {
	   	if (!dfn[i]) tarjian(i);
	   }
	if (scc==1)
	{
		puts("0");
		return;
	}
	int ret1=0,ret2=0;
	for (int i=0;i<tot;i++)
	{
		int v=Belong[edge[i].v];
		int u=Belong[edge[i].u];
		if (u==v) continue;
		degin[v]++;
		degout[u]++;
	}
	for (int i=1;i<=scc;i++)
	{
		if (degin[i]==0) ret1++;
		if (degout[i]==0) ret2++;
	}
	printf("%d\n",max(ret1,ret2));
}

int main(){
	int T;
	scanf("%d",&T);
	while (T--){
		scanf("%d%d",&N,&M);
		init();
		for (int i=0;i<M;i++)
		{
			int u,v;
			scanf("%d%d",&u,&v);
			add(u,v,9797);
		}
		deal();
	}
  return 0;
}
全部评论

相关推荐

迟缓的斜杠青年巴比Q了:简历被投过的公司卖出去了,我前两天遇到过更离谱的,打电话来问我有没有意向报班学Java学习,服了,还拿我学校一个学长在他们那报班学了之后干了华为OD当招牌
点赞 评论 收藏
分享
04-13 18:10
门头沟学院 Java
想熬夜的小飞象在秋招:被腾讯挂了后爸妈以为我失联了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务