poj 3180 The Cow Prom (Tarjan 求>=2的集团数)

题目链接:http://poj.org/problem?id=3180

没什么意思直接套模板就行

code:

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

using namespace std;

const int maxn=10010;
const int maxe=80000;

struct edge
{
	int to,next;
} P[maxe];
int head[maxn],si;
int low[maxn],dfn[maxn],sst[maxn],belong[maxn];
int index,top;
int scc;
bool in_sst[maxn];
int num[maxn];
int N,M;

void add_edge(int s,int t)
{
	P[si].to=t;
	P[si].next=head[s];
	head[s]=si++;
}
void Tarjan(int u)
{
	int v;
	low[u]=dfn[u]=++index;
	sst[top++]=u;
	in_sst[u]=true;
	for(int i=head[u];i!=-1;i=P[i].next){
		v=P[i].to;
		if(!dfn[v]){
			Tarjan(v);
			if(low[u]>low[v]) low[u]=low[v];
		}
		else if(in_sst[v]&&low[u]>dfn[v]) low[u]=dfn[v];
	}
	if(low[u]==dfn[u]){
		scc++;
		while(1){
			v=sst[--top];
			in_sst[v]=false;
			belong[v]=scc;
			num[scc]++;
			if(v==u) break;
		}
	}
}
void solve(int N)
{
	memset(dfn,0,sizeof(dfn));
	memset(in_sst,0,sizeof(in_sst));
	memset(num,0,sizeof(num));
	index=scc=top=0;
	for(int i=1;i<=N;i++)	if(!dfn[i]) Tarjan(i);
}
int main()
{
	int s,t,cnt;
	while(scanf("%d%d",&N,&M)!=EOF){
        memset(head,-1,sizeof(head));
        si=0;
		for(int kk=0;kk<M;kk++){
			scanf("%d%d",&s,&t);
			add_edge(s,t);
		}
		solve(N);
		cnt=0;
		for(int i=1;i<=scc;i++) if(num[i]>=2) cnt++;
		printf("%d\n",cnt);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值