poj 2186 强连通入门题目

每头牛的梦想就是成为牛群中最受欢迎的牛。 在一群N(1 <= N <= 10,000)母牛中,

你可以得到M(1 <= M <= 50,000)有序的形式对(A,B),告诉你母牛A认为母牛 B很受欢迎。

由于流行是传递性的,如果A认为B很受欢迎,B认为C受欢迎,那么A也会认为C是
流行的,即使这不是输入中有序对明确规定的。

你的任务是计算每头奶牛认为受欢迎的奶牛数量。

水题 强连通入门题目。

tarjin缩点  然后就变成一棵树,

然后就是求有多少个点的出度为0

输入这个点里面包含的所有点,因为有缩点出来的

所有输出他的强连通分量

缩点后如果有多个出度为0的点,这样是不符合题意的,输出0

不联通 也是输出0

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <string>
 4 #include <algorithm>
 5 #include <queue>
 6 using namespace std;
 7
 8 const int maxn = 1e5 + 10;
 9 int n, m, u, v, tot, top, cnt, flag;
10 struct node {
11     int v, next;
12 } edge[maxn];
13 int head[maxn], instack[maxn], s[maxn];
14 int dfn[maxn], low[maxn], belong[maxn];
15 void init() {
16     tot = cnt = top = flag = 0;
17     memset(head, -1, sizeof(head));
18     memset(dfn, 0, sizeof(dfn));
19     memset(instack, 0, sizeof(instack));
20 }
21 void add(int u, int v) {
22     edge[tot].v = v;
23     edge[tot].next = head[u];
24     head[u] = tot++;
25 }
26 void tarjin(int v) {
27     dfn[v] = low[v] = ++flag;
28     instack[v] = 1;
29     s[top++] = v;
30     for (int i = head[v] ; i != -1 ; i = edge[i].next) {
31         int j = edge[i].v;
32         if (!dfn[j]) {
33             tarjin(j);
34             low[v] = min(low[v], low[j]);
35         } else if (instack[j]) low[v] = min(low[v], dfn[j]);
36     }
37     if (dfn[v] == low[v]) {
38         cnt++;
39         int t;
40         do {
41             t = s[--top];
42             instack[t] = 0;
43             belong[t] = cnt;
44         } while(t != v) ;
45     }
46 }
47 int du[maxn];
48 void solve() {
49     for (int i = 1 ; i <= n ; i++)
50         if (!dfn[i]) tarjin(i);
51 }
52 int main() {
53     while(scanf("%d%d", &n, &m) != EOF) {
54         if (n == 0 && m == 0) break;
55         init();
56         memset(du, 0, sizeof(du));
57         for (int i = 0 ; i < m ; i++) {
58             scanf("%d%d", &u, &v);
59             add(u, v);
60         }
61         for (int i = 1  ; i <= n ; i++)
62             if (!dfn[i]) tarjin(i);
63         for (int i = 1 ; i <= n ; i++) {
64             for (int j = head[i] ; ~j; j = edge[j].next ) {
65                 if (belong[edge[j].v] != belong[i]) du[belong[i]]++;
66             }
67         }
68         int ansrt, zero = 0;
69         for (int i = 1 ; i <= cnt ; i++) {
70             if (!du[i]) {
71                 ansrt = i;
72                 zero++;
73             }
74         }
75         if (zero == 1) {
76             int ans = 0;
77             for (int i = 1 ; i <= n ; i++) {
78                 if (belong[i] == ansrt) ans++;
79             }
80             printf("%d\n", ans);
81         } else printf("0\n");
82     }
83     return 0;
84 }

原文地址:https://www.cnblogs.com/qldabiaoge/p/9072646.html

时间: 2024-08-08 10:57:33

poj 2186 强连通入门题目的相关文章

POJ(2186)强连通分量分解

#include<cstdio> #include<vector> #include<cstring> using namespace std; const int MAX_N=10005; vector<int> G[MAX_N]; vector<int> rG[MAX_N];//存储边反向之后的图 vector<int> PostOrder;//存储图的后序遍历 int V,E; bool used[MAX_N]; int com

Poj 2186 Popular Cows (Tarjan)

题目链接: Poj 2186 Popular Cows 题目描述: 有n只牛,牛之间存在一些关系,比如a认为b很受欢迎,b认为c很受欢迎,这样呢,a也会认为c很受欢迎,问根据给出的关系,有多少头牛被其他所有的牛都认为是受欢迎的? 解题思路: 对于一个有向无环图来说,其中有且仅有一个点出度为零,那么这个特殊的点,可以由其他任何点到达.那么接下来我们直接对所给的图进行强连通分量划分,然后把每个强连通分量看做一个点,判定出度为零的点有几个,如果有一个就输出这个点对应的强连通分量含有的节点个数,否则为零

poj 2186 Popular Cows 【强连通】

题目:poj 2186 Popular Cows 题意:n头牛,其中存在一些牛相互崇拜,具有传递性,问有多少头牛是被其他所有牛崇拜的. 分析:建立一个有向图,然后强连通缩点,之后求出度为0的点,假如存在多个,那么ans = 0,因为缩点之后如果x崇拜y,x也崇拜z,那么肯定y和z不能互相崇拜,不满足. 然后求出度为0的这个点缩点前环上有多少个点就ans AC代码: #include <cstdio> #include <vector> #include <iostream&g

POJ 2186 Popular Cows --强连通分量

题意:给定一个有向图,问有多少个点由任意顶点出发都能达到. 分析:首先,在一个有向无环图中,能被所有点达到点,出度一定是0. 先求出所有的强连通分支,然后把每个强连通分支收缩成一个点,重新建图,这样,这个有向图就变成了一个有向无环图. 在这个新的图中,只需知道出度为0的点有几个即可. 如果出度为0的点超过1个,则输出0:否则输出出度为0的点所代表的那个强连通分支的分量数即可. 用Tarjan求强连通分量 代码: #include <iostream> #include <cstdio&g

POJ 2186 Popular Cows (强连通分量)

POJ 2186 Popular Cows 链接:http://poj.org/problem?id=2186 题意:每头奶牛都梦想着成为牧群中最受奶牛仰慕的奶牛.在牧群中,有N 头奶牛,1≤N≤10,000,给定M 对(1≤M≤50,000)有序对(A, B),表示A 仰慕B.由于仰慕关系具有传递性,也就是说,如果A 仰慕B,B 仰慕C,则A 也仰慕C,即使在给定的M 对关系中并没有(A, C).你的任务是计算牧群中受每头奶牛仰慕的奶牛数量. 思路:首先可以知道,在同一个强连通分量内的点一定互

强连通分量分解 Kosaraju算法 (poj 2186 Popular Cows)

poj 2186 Popular Cows 题意: 有N头牛, 给出M对关系, 如(1,2)代表1欢迎2, 关系是单向的且可以传递, 即1欢迎2不代表2欢迎1, 但是如果2也欢迎3那么1也欢迎3. 求被所有牛都欢迎的牛的数量. 限制: 1 <= N <= 10000 1 <= M <= 50000 思路: Kosaraju算法, 看缩点后拓扑序的终点有多少头牛, 且要判断是不是所有强连通分量都连向它. Kosaraju算法,分拆完连通分量后,也完成了拓扑序. /*poj 2186

Poj 2186 Popular Cows(Tarjan 强连通缩点)

传送门:Poj 2186 题意:给你n头牛,m种关系,A牛认为B牛是popular的,B牛认为C牛是popular的,则A也认为C是popular的,问最终有几头被所有牛认为是popular的牛 题解:强连通缩点基础题(虽然我Tarjan和缩点都是对的,但是最终讨论判断的时候写垮了(写了3天....还不是你懒!!!!过年划水这么多天缩点后找出度为零的点个数.然后讨论是否有这样子的点,如果没有则全都是(整个都是强连通图),如果只有一个,那么那个强连通分量所含的牛的个数就是所求解,如果有多个那么都是

Oil Deposits(poj 1526 DFS入门题)

http://poj.org/problem?id=1562 Oil Deposits Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12595   Accepted: 6868 Description The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp wor

POJ 2186 Popular Cows -- tarjan 缩点

链接: POJ 2186 Popular Cows 题意: 每一头牛都希望在牛群里面备受瞩目,在一个牛群中有N头牛(1<=N<=10000),你被给予M(1<=M<=50000)个关系对,形式如(A,B),这意味着A牛认为B牛比它更受欢迎,由于这种欢迎度是满足传递性的,那么若是A牛认为B牛更受欢迎,B牛认为C牛更受欢迎,那么A牛也会认为C牛更受欢迎.你的任务是计算出被所有牛受欢迎的牛的个数. 输入: 第一行两个整数 N 和 M 第2 到 M + 1 行,两个分开的数 A,B,意味着