poj 3180 The Cow Prom 强连通分量

水题,直接贴代码。

//poj 3180
//sep9
#include <iostream>
#include <stack>
using namespace std;
const int maxN=10024;
const int maxM=50048;
int sum[maxN];
int head[maxN],dfn[maxN],low[maxN],ins[maxN],belong[maxN];
stack<int> s;
struct Edge{
	int v,next;
}edge[maxM];
int n,m,e,t,cnt;

void tarjan(int u){
	dfn[u]=low[u]=++t;
	s.push(u);
	ins[u]=1;
	for(int i=head[u];i!=-1;i=edge[i].next){
		int v=edge[i].v;
		if(dfn[v]==0){
			tarjan(v);
			low[u]=min(low[u],low[v]);
		}else if(ins[v]==1)
			low[u]=min(low[u],dfn[v]);
	}
	int k;
	if(low[u]==dfn[u]){
		++cnt;
		do{
			k=s.top();
			s.pop();
			ins[k]=0;
			belong[k]=cnt;
		}while(low[k]!=dfn[k]);
	}
	return ;
}

int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
 	e=0;
  	memset(head,-1,sizeof(head));
   	memset(dfn,0,sizeof(dfn));
    memset(ins,0,sizeof(ins));
	while(m--){
		int a,b;
		scanf("%d%d",&a,&b);
		edge[e].v=b;edge[e].next=head[a];head[a]=e++;
	}
	t=cnt=0;
	for(int i=0;i<n;++i)
		if(!dfn[i])
			tarjan(i);
	memset(sum,0,sizeof(sum));
	for(int i=0;i<n;++i)
		++sum[belong[i]];
	int ans=0;
	for(int i=1;i<=cnt;++i)
		if(sum[i]>1)
			++ans;
	printf("%d",ans);
	return 0;
} 
时间: 2024-10-12 06:57:14

poj 3180 The Cow Prom 强连通分量的相关文章

poj 3180 The Cow Prom(tarjan+缩点 easy)

Description The N (2 <= N <= 10,000) cows are so excited: it's prom night! They are dressed in their finest gowns, complete with corsages and new shoes. They know that tonight they will each try to perform the Round Dance. Only cows can perform the

POJ 3180 The Cow Prom

传送门:http://poj.org/problem?id=3180 解题思路: #include <cstdio> #include <algorithm> #include <cstring> #include <map> #include <iostream> using namespace std; const int MAXN=10010; const int MAXM=50010; struct Edge{ int to; int n

POJ 3180 The Cow Prom(强联通)

题目大意: 约翰的N(2≤N≤10000)只奶牛非常兴奋,因为这是舞会之夜!她们穿上礼服和新鞋子,别上鲜花,她们要表演圆舞. 只有奶牛才能表演这种圆舞.圆舞需要一些绳索和一个圆形的水池.奶牛们围在池边站好,顺时针顺序由1到N编号.每只奶牛都面对水池,这样她就能看到其他的每一只奶牛.为了跳这种圆舞,她们找了M(2≤M≤50000)条绳索.若干只奶牛的蹄上握着绳索的一端,绳索沿顺时针方绕过水池,另一端则捆在另一些奶牛身上.这样,一些奶牛就可以牵引另一些奶牛.有的奶牛可能握有很多绳索,也有的奶牛可能一

POJ 3180 The cow Prom Tarjan基础题

题目用google翻译实在看不懂 其实题目意思如下 给一个有向图,求点个数大于1的强联通分量个数 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<vector> 5 #include<stack> 6 #define M 50010 7 #define N 10010 8 using namespace std; 9 int n,m,u,v,head[

Poj 1904 King&#39;s Quest 强连通分量

题目链接: http://poj.org/problem?id=1904 题意: 有n个王子和n个公主,王子只能娶自己心仪的公主(一个王子可能会有多个心仪的公主),现已给出一个完美匹配,问每个王子都可以取哪些公主,并且保证取了一个公主后,全局还是存在完美匹配. 题解: 1.建图: 如果王子u对公主v心仪,则连一条边u->v.在样例给出的那组完美匹配中,如果王子u娶了公主v,连一条边v->u. 2.求强连通分量: 如果王子和自己心仪的公主属于同一个强连通分量,那么王子就可以娶这个公主. 1 #i

POJ - 1904 King&#39;s Quest(强连通分量+二分图匹配)

题目大意:有N个帅哥和N个美女,现在给出每个帅哥所喜欢的美女的编号,和一个帅哥和美女的完美匹配 问每个帅哥可以娶多少个美女,且当他娶完这个美女后,剩下的人还可以完美匹配 解题思路:神题啊,给一个大神的详细解答 具体是这样的,首先先建边,把帅哥和能娶到的美女连边,再把完美匹配的美女和帅哥连边,这样就形成了一张有向图了 接着,找出这张有向图的所有强连通分量,在强连通分量里面的帅哥都可以娶到自己喜欢的美女,且娶完这个美女后,不会影响到其他人 为什么呢? 假设xi为帅哥,yi和yj为美女,假设给定的完美

POJ 1904 King&#39;s Quest 强连通分量+二分图增广判定

http://www.cnblogs.com/zxndgv/archive/2011/08/06/2129333.html 这位神说的很好 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <string> #include <stack> #include <ve

POJ 1904 King&#39;s Quest强连通分量+二分图完美匹配

题目描述: Description Once upon a time there lived a king and he had N sons. And there were N beautiful girls in the kingdom and the king knew about each of his sons which of those girls he did like. The sons of the king were young and light-headed, so i

poj 2186 Popular Cows 【强连通分量Tarjan算法 + 树问题】

题目地址:http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27496   Accepted: 11059 Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows