缩点练习

洛谷 P3387 【模板】缩点

缩点

解题思路:

都说是模板了...先缩点把有环图转换成DAG

然后拓扑排序即可

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. /* freopen("k.in", "r", stdin);
  4. freopen("k.out", "w", stdout); */
  5. //clock_t c1 = clock();
  6. //std::cerr << "Time:" << clock() - c1 <<"ms" << std::endl;
  7. //#pragma comment(linker, "/STACK:1024000000,1024000000")
  8. #define de(a) cout << #a << " = " << a << endl
  9. #define rep(i, a, n) for (int i = a; i <= n; i++)
  10. #define per(i, a, n) for (int i = n; i >= a; i--)
  11. typedef long long ll;
  12. typedef unsigned long long ull;
  13. typedef pair<int, int> PII;
  14. typedef pair<double, double> PDD;
  15. typedef vector<int, int> VII;
  16. #define inf 0x3f3f3f3f
  17. const ll INF = 0x3f3f3f3f3f3f3f3f;
  18. const ll MAXN = 5e5 + 7;
  19. const ll MAXM = 1e6 + 7;
  20. const ll MOD = 1e9 + 7;
  21. const double eps = 1e-6;
  22. const double pi = acos(-1.0);
  23. int head[MAXN], head1[MAXN];
  24. int in[MAXN];
  25. int n, m;
  26. int vis[MAXN];
  27. int dfn[MAXN], low[MAXN], dep;
  28. int sta[MAXN], top = -1;
  29. int tot; //强联通分量编号
  30. int dis[MAXN];
  31. int p[MAXN];
  32. int num[MAXN];
  33. struct Edge
  34. {
  35. int u, v, Next;
  36. Edge(int _u = 0, int _v = 0, int _Next = 0) { u = _u, v = _v, Next = _Next; }
  37. } e[MAXN << 1], ed[MAXN << 1];
  38. int cnt = -1;
  39. void add(int u, int v)
  40. {
  41. e[++cnt].v = v;
  42. e[cnt].u = u;
  43. e[cnt].Next = head[u];
  44. head[u] = cnt;
  45. }
  46. void tarjan(int now)
  47. {
  48. dfn[now] = low[now] = ++dep;
  49. sta[++top] = now;
  50. vis[now] = 1;
  51. for (int i = head[now]; ~i; i = e[i].Next)
  52. {
  53. int v = e[i].v;
  54. if (!dfn[v])
  55. {
  56. tarjan(v);
  57. low[now] = min(low[now], low[v]);
  58. }
  59. else if (vis[v])
  60. low[now] = min(low[now], low[v]);
  61. }
  62. if (dfn[now] == low[now])
  63. {
  64. ++tot;
  65. while (sta[top] != now)
  66. {
  67. vis[sta[top]] = 0;
  68. num[sta[top]] = tot;
  69. dis[tot] += p[sta[top--]];
  70. }
  71. vis[sta[top]] = 0;
  72. dis[tot] += p[sta[top]];
  73. num[sta[top--]] = tot;
  74. }
  75. }
  76. int dp[MAXN];
  77. int topo()
  78. {
  79. queue<int> q;
  80. int ans = -inf;
  81. int k = 0;
  82. for (int i = 1; i <= tot; i++)
  83. if (!in[i])
  84. q.push(i), dp[i] = dis[i];
  85. while (!q.empty())
  86. {
  87. int now = q.front();
  88. q.pop();
  89. k++;
  90. for (int i = head1[now]; ~i; i = ed[i].Next)
  91. {
  92. int v = ed[i].v;
  93. in[v]--;
  94. dp[v] = max(dp[v], dp[now] + dis[v]);
  95. if (!in[v])
  96. q.push(v);
  97. }
  98. }
  99. for (int i = 1; i <= tot; i++)
  100. ans = max(ans, dp[i]);
  101. return ans;
  102. }
  103. int main()
  104. {
  105. memset(head, -1, sizeof(head));
  106. memset(head1, -1, sizeof(head1));
  107. scanf("%d%d", &n, &m);
  108. for (int i = 1; i <= n; i++)
  109. scanf("%d", &p[i]);
  110. for (int i = 0; i < m; i++)
  111. {
  112. int u, v;
  113. scanf("%d%d", &u, &v);
  114. add(u, v);
  115. }
  116. for (int i = 1; i <= n; i++)
  117. if (!dfn[i])
  118. tarjan(i);
  119. cnt = -1;
  120. for (int i = 0; i < m; i++)
  121. {
  122. int x = e[i].u, y = e[i].v;
  123. if (num[x] != num[y]) //不在一个强连通分量
  124. {
  125. int u = num[x], v = num[y];
  126. ed[++cnt].u = u;
  127. ed[cnt].v = v;
  128. ed[cnt].Next = head1[u];
  129. head1[u] = cnt;
  130. in[v]++;
  131. }
  132. }
  133. printf("%d\n", topo());
  134. return 0;
  135. }

poj 2196 Popular Cows

Popular Cows

Every cow's dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows, you are given up to M (1 <= M <= 50,000) ordered pairs of the form (A, B) that tell you that cow A thinks that cow B is popular. Since popularity is transitive, if A thinks B is popular and B thinks C is popular, then A will also think that C is

popular, even if this is not explicitly specified by an ordered pair in the input. Your task is to compute the number of cows that are considered popular by every other cow.

Input

  • Line 1: Two space-separated integers, N and M

  • Lines 2..1+M: Two space-separated numbers A and B, meaning that A thinks B is popular.

    Output

  • Line 1: A single integer that is the number of cows who are considered popular by every other cow.

Sample Input

3 3

1 2

2 1

2 3

Sample Output

1

解题思路:

将原图缩点之后重新建图,那么被所有牛崇拜的牛必然在出度为0的一个强连通分量内,如果有一个以上出度为0的强联通分量,则说明不存在被所有牛崇拜的牛,如果出度为0的强联通分量为1那么直接输出该强联通分量内牛的数量即可

  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <cstdlib>
  7. #include <set>
  8. #include <vector>
  9. #include <cctype>
  10. #include <iomanip>
  11. #include <sstream>
  12. #include <climits>
  13. #include <queue>
  14. #include <stack>
  15. using namespace std;
  16. /* freopen("k.in", "r", stdin);
  17. freopen("k.out", "w", stdout); */
  18. //clock_t c1 = clock();
  19. //std::cerr << "Time:" << clock() - c1 <<"ms" << std::endl;
  20. //#pragma comment(linker, "/STACK:1024000000,1024000000")
  21. #define de(a) cout << #a << " = " << a << endl
  22. #define rep(i, a, n) for (int i = a; i <= n; i++)
  23. #define per(i, a, n) for (int i = n; i >= a; i--)
  24. typedef long long ll;
  25. typedef unsigned long long ull;
  26. typedef pair<int, int> PII;
  27. typedef pair<double, double> PDD;
  28. typedef vector<int, int> VII;
  29. #define inf 0x3f3f3f3f
  30. const ll INF = 0x3f3f3f3f3f3f3f3f;
  31. const ll MAXN = 5e5 + 7;
  32. const ll MAXM = 1e6 + 7;
  33. const ll MOD = 1e9 + 7;
  34. const double eps = 1e-6;
  35. const double pi = acos(-1.0);
  36. int n, m;
  37. int head[MAXN], dis[MAXN];
  38. int in[MAXN];
  39. struct Edge
  40. {
  41. int u, v, Next;
  42. Edge(int _u = 0, int _v = 0, int _Next = 0) { u = _u, v = _v, Next = _Next; }
  43. } e[MAXN], ed[MAXN];
  44. int cnt = -1;
  45. void add(int u, int v)
  46. {
  47. e[++cnt].u = u;
  48. e[cnt].v = v;
  49. e[cnt].Next = head[u];
  50. head[u] = cnt;
  51. }
  52. int dfn[MAXN], low[MAXN], dep;
  53. int tot;
  54. int sta[MAXN], top = -1, vis[MAXN];
  55. int num[MAXN];
  56. void tarjan(int now)
  57. {
  58. dfn[now] = low[now] = ++dep;
  59. sta[++top] = now;
  60. vis[now] = 1;
  61. for (int i = head[now]; ~i; i = e[i].Next)
  62. {
  63. int v = e[i].v;
  64. if (!dfn[v])
  65. {
  66. tarjan(v);
  67. low[now] = min(low[now], low[v]);
  68. }
  69. else if (vis[v])
  70. low[now] = min(low[now], low[v]);
  71. }
  72. if (dfn[now] == low[now])
  73. {
  74. tot++;
  75. while (sta[top] != now)
  76. {
  77. num[sta[top]] = tot;
  78. dis[tot]++;
  79. vis[sta[top--]] = 0;
  80. }
  81. vis[sta[top]] = 0;
  82. dis[tot]++;
  83. num[sta[top--]] = tot;
  84. }
  85. }
  86. int main()
  87. {
  88. memset(head, -1, sizeof(head));
  89. scanf("%d%d", &n, &m);
  90. for (int i = 0; i < m; i++)
  91. {
  92. int u, v;
  93. scanf("%d%d", &u, &v);
  94. add(u, v);
  95. }
  96. for (int i = 1; i <= n; i++)
  97. if (!dfn[i])
  98. tarjan(i);
  99. //重新建图
  100. for (int i = 0; i < m; i++)
  101. {
  102. int x = e[i].u, y = e[i].v;
  103. if (num[x] != num[y])
  104. {
  105. int u = num[x], v = num[y];
  106. in[u]++; //这里是出度....
  107. }
  108. }
  109. int tt = 0;
  110. int ans = 0;
  111. for (int i = 1; i <= tot; i++)
  112. {
  113. if (!in[i])
  114. {
  115. tt++;
  116. ans = max(ans, dis[i]);
  117. }
  118. }
  119. if (tt > 1)
  120. ans = 0;
  121. printf("%d\n", ans);
  122. return 0;
  123. }
  124. /*
  125. 7 8
  126. 1 2
  127. 2 4
  128. 4 6
  129. 6 7
  130. 7 6
  131. 1 3
  132. 3 5
  133. 5 6
  134. */

tarjan缩点练习 洛谷P3387 【模板】缩点+poj 2186 Popular Cows的更多相关文章

  1. poj 2186 Popular Cows (强连通分量+缩点)

    http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissi ...

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

    题目地址:http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Sub ...

  3. poj 2186 Popular Cows【tarjan求scc个数&&缩点】【求一个图中可以到达其余所有任意点的点的个数】

    Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27698   Accepted: 11148 De ...

  4. POJ 2186 Popular Cows(Targin缩点)

    传送门 Popular Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 31808   Accepted: 1292 ...

  5. poj 2186 Popular Cows tarjan

    Popular Cows Description Every cow's dream is to become the most popular cow in the herd. In a herd ...

  6. POJ 2186 Popular Cows tarjan缩点算法

    题意:给出一个有向图代表牛和牛喜欢的关系,且喜欢关系具有传递性,求出能被所有牛喜欢的牛的总数(除了它自己以外的牛,或者它很自恋). 思路:这个的难处在于这是一个有环的图,对此我们可以使用tarjan算 ...

  7. POJ 2186 Popular Cows(强连通分量缩点)

    题目链接:http://poj.org/problem?id=2186 题目意思大概是:给定N(N<=10000)个点和M(M<=50000)条有向边,求有多少个“受欢迎的点”.所谓的“受 ...

  8. [poj 2186]Popular Cows[Tarjan强连通分量]

    题意: 有一群牛, a会认为b很帅, 且这种认为是传递的. 问有多少头牛被其他所有牛认为很帅~ 思路: 关键就是分析出缩点之后的有向树只能有一个叶子节点(出度为0). 做法就是Tarjan之后缩点统计 ...

  9. poj 2186 Popular Cows :求能被有多少点是能被所有点到达的点 tarjan O(E)

    /** problem: http://poj.org/problem?id=2186 当出度为0的点(可能是缩点后的点)只有一个时就存在被所有牛崇拜的牛 因为如果存在有两个及以上出度为0的点的话,他 ...

随机推荐

  1. 我们基于kaldi开发的嵌入式语音识别系统升级成深度学习啦

    先前的文章<三个小白是如何在三个月内搭一个基于kaldi的嵌入式在线语音识别系统的>说我们花了不到三个月的时间搭了一个基于kaldi的嵌入式语音识别系统,不过它是基于传统的GMM-HMM的 ...

  2. Logback 学习指南 一

    因为项目中用到 SpringBoot,看到官方文档中提及默认的日志实现是 logback,因此就通过阅读手册和结合实践学习了下相关的知识,记录下以备查阅. 1. logback 是什么? logbac ...

  3. HDU3709 Balanced Number 题解 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3709 题目大意: 求区间 \([x, y]\) 范围内"平衡数"的数量. 所谓平衡 ...

  4. HDU3555 Bomb 题解 数位DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题目大意:求 \([1,n]\) 范围内有多少数包含"49". 解题思路: ...

  5. BZOJ 2038: [2009国家集训队]小Z的袜子 (莫队)

    题目传送门:小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命…… ...

  6. 假设检验的Python实现

    结合假设检验的理论知识,本文使用Python对实际数据进行假设检验. 导入测试数据 从线上下载测试数据文件,数据链接:https://pan.baidu.com/s/1t4SKF6U2yyjT365F ...

  7. Math&Random&ThreadLocalRandom类

    Math类 //绝对值值运算: Math.abs(18.999); //返回19.999这个数的绝对值 Math.abs(-12.58); // 返回-12.58这个数的绝对值,为12.58 //取值 ...

  8. KindEditor.ready 不执行的解决方法

    问题描述 按照官网的要求,一一都设置好了,但就是没法显示富文本编辑器. 1.设置好textarea输入框 <textarea id="myEditor" name=" ...

  9. 第7节class与style绑定

    方法一 效果图:  方法二 效果图:  方法三 效果图: 代码: <!DOCTYPE html> <html lang="en" xmlns:v-bind=&qu ...

  10. git 工作实用创建删除分支

    一.创建分支 .创建本地分支并切换 git checkout -b dev_wt2 .创建切换并关联远程分支 git checkout -b dev_wt3 orgin/dev_wt3 .创建远程分支 ...