poj 2186 Popular Cows

原创 2012年03月21日 16:20:35
类型:有向图连通性

题目:有n头牛,m个形式如(A, B)表示牛B受牛A欢迎,求受所有牛欢迎的牛的数量

来源:USACO 2003 Fall

思路:在同一强连通分量中,不同牛之间相互受欢迎,可以将其看做一个点[缩点],构造新图。假设新图连通,如果某个牛受所有其他牛欢迎,则其顶点的出度为0,其他点出度不为0,否则将不存在牛受其他所有牛欢迎。如果新图不连通,则存在多个出度为0的点。所以可以通过判断新图点出度为0的个数是否为1来判断解是否存在,如果存在,输出该强连通分量中的点

// poj 2186 Popular Cows
// ac 676K 79MS
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

#define MIN(a,b) (a) < (b) ? (a) : (b)
#define clr(a,b) memset(a,b,sizeof(a))
#define FOR(i,a,b) for((i) = (a); (i) < (b); ++i)
#define FORE(i,a,b) for((i) = (a); (i) <= (b); ++i)
#define MAXN 10100
#define MAXM 50100

bool vis[MAXN];
int num, cnt, count_node, kk, m, n, cnt_num;
int top, u[MAXM], v[MAXM], step[MAXN], low[MAXN];
int head[MAXN],belong[MAXN],stack[MAXN];
struct edge{
    int v,nxt;
}e[MAXM];

void Tarjan(int u) {
	int i, j, v;

	step[u] = low[u] = ++num;
	stack[++top] = u, vis[u] = true;//in_stack[u] = true;
	for(i = head[u]; i != -1; i = e[i].nxt) {
		v = e[i].v;
		if(!step[v]) {
			Tarjan(v);
			low[u] = MIN(low[u],low[v]);
		}
		else if(vis[v])
			low[u] = MIN(low[u],step[v]);
	}
	if(step[u] == low[u]){
		cnt_num++;
		do{
			j = stack[top--];
			vis[j] = false;
//			in_stack[j] = false;
			belong[j] = cnt_num;
		}while(j != u);
	}
}

int main() {
	int i,j,u, v;

	while(scanf("%d %d", &n, &m) != EOF){
		clr(head, -1);
		clr(step, 0);
		clr(belong, 0);
		clr(vis, false); //clr(in_stack,false);
		top = num = cnt = cnt_num = kk = count_node = 0;
		FOR(i, 0, m) {
			scanf("%d %d", &u, &v);
			e[cnt].v = v;
			e[cnt].nxt = head[u];
			head[u] = cnt++;
		}
		FORE(i, 1, n)
			if(!step[i])
                Tarjan(i);
		FORE(i, 1, n)
			for(j = head[i]; j != -1; j = e[j].nxt)
				if(belong[i] != belong[e[j].v])
					vis[belong[i]] = true;
		FORE(i, 1, cnt_num)
			if(!vis[i]) {
                count_node++;
                kk = i;
            }
		//!!!
		if(count_node != 1)
			printf("0\n");
		else{
			int ans = 0;
			FORE(j, 1, n)
				if(belong[j] == kk) ans++;
			printf("%d\n",ans);
		}
	}
    return 0;
}


相关文章推荐

【强连通分量+缩点】 POJ 2186 Popular Cows

先求出强连通,再缩点。然后qiu

poj 2186 Popular Cows (Tarjan 强连通分量+压缩点)

考察算法:强连通分量+压缩点。 先说明下题目的大意。 有一群牛在相互崇拜。崇拜是单向的。且崇拜是可传递的,即a->b,b->c,可以得到a->c。 分别告诉你总共有n头牛,m条彼此间的崇拜关系,...

POJ2186--Popular Cows

Description Every cow's dream is to become the most popular cow in the herd. In a herd of N (1
  • a305657
  • a305657
  • 2013年07月21日 02:09
  • 530

poj2186 - Popular Cows

想看更多的解题报告:http://blog.csdn.net/wangjian8006/article/details/7870410                                ...

poj 2186--Popular Cows

题意:农场有N个大牛,有些大牛喜欢

POJ2186 Popular Cows 【裸缩环+Gabow算法强连通分量分解再建图】

这题比较裸,根据牛的膜拜情况建图,然后强连通分量处理,处理后再建新图,记录出度入度,找出所有出度为0的,如果有2个及以上的,则输出(0),很简单,不可能有被所有牛膜拜的牛了(因为这几个结点互相不可达)...

POJ 2186 Popular Cows

强连通分量

【poj2186】 Popular Cows

http://poj.org/problem?id=2186 (题目链接)题意:给出一个n个点m条边的有向图,求其中没有出度强连通分量所包含的点有几个Solution   其实这道题的题解已经在“题...

POJ - 2186 - Popular Cows (tarjan)

Popular Cows题目传送:Popular Cows思路:tarjan算法求强连通分量AC代码:#include #include #include #include #include ...

POJ_2186_Popular Cows

#include #include #include #include #include #include #include #in...
  • cxy7tv
  • cxy7tv
  • 2016年04月13日 22:28
  • 98
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2186 Popular Cows
举报原因:
原因补充:

(最多只允许输入30个字)