题目链接

对于每一个联通块, 如果有一个强连通分量, 那么这个联通块对答案的贡献就是0。 否则对答案贡献是1.

  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <complex>
  7. #include <cmath>
  8. #include <map>
  9. #include <set>
  10. #include <string>
  11. #include <queue>
  12. #include <stack>
  13. #include <bitset>
  14. using namespace std;
  15. #define pb(x) push_back(x)
  16. #define ll long long
  17. #define mk(x, y) make_pair(x, y)
  18. #define lson l, m, rt<<1
  19. #define mem(a) memset(a, 0, sizeof(a))
  20. #define rson m+1, r, rt<<1|1
  21. #define mem1(a) memset(a, -1, sizeof(a))
  22. #define mem2(a) memset(a, 0x3f, sizeof(a))
  23. #define rep(i, n, a) for(int i = a; i<n; i++)
  24. #define fi first
  25. #define se second
  26. typedef complex <double> cmx;
  27. typedef pair<int, int> pll;
  28. const double PI = acos(-1.0);
  29. const double eps = 1e-8;
  30. const int mod = 1e9+7;
  31. const int inf = 1061109567;
  32. const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
  33. const int maxn = 1e5+5;
  34. int num, head[maxn], s[maxn], ok[maxn], dfn[maxn], low[maxn];
  35. int instack[maxn], st[maxn], vis[maxn], deep, cnt, top;
  36. struct node
  37. {
  38. int to, nextt;
  39. }e[maxn*2];
  40. void add(int u, int v) {
  41. e[num].to = v, e[num].nextt = head[u], head[u] = num++;
  42. }
  43. void tarjan(int u, int fa) {
  44. dfn[u] = low[u] = ++deep;
  45. st[++top] = u;
  46. instack[u] = 1;
  47. for(int i = head[u]; ~i; i = e[i].nextt) {
  48. int v = e[i].to;
  49. if(v == fa)
  50. continue;
  51. if(!dfn[v]) {
  52. tarjan(v, u);
  53. low[u] = min(low[u], low[v]);
  54. } else if(instack[v]) {
  55. low[u] = min(low[u], dfn[v]);
  56. }
  57. }
  58. if(dfn[u] == low[u]) {
  59. ++cnt;
  60. int v;
  61. do {
  62. v = st[top--];
  63. instack[v] = 0;
  64. s[v] = cnt;
  65. } while(u != v);
  66. }
  67. }
  68. int bfs(int u) {
  69. queue <int> q;
  70. q.push(u);
  71. vis[u] = 1;
  72. int flag = 0;
  73. while(!q.empty()) {
  74. u = q.front(); q.pop();
  75. if(ok[u])
  76. flag = 1;
  77. for(int i = head[u]; ~i ; i = e[i].nextt) {
  78. int v = e[i].to;
  79. if(vis[v])
  80. continue;
  81. q.push(v);
  82. vis[v] = 1;
  83. }
  84. }
  85. return !flag;
  86. }
  87. pll ed[maxn];
  88. int main()
  89. {
  90. int n, m;
  91. cin>>n>>m;
  92. mem1(head);
  93. for(int i = 0; i < m; i++) {
  94. scanf("%d%d", &ed[i].fi, &ed[i].se);
  95. add(ed[i].fi, ed[i].se);
  96. add(ed[i].se, ed[i].fi);
  97. }
  98. for(int i = 1; i <= n; i++)
  99. if(!dfn[i])
  100. tarjan(i, 0);
  101. num = 0;
  102. mem1(head);
  103. for(int i = 0; i < m; i++) {
  104. int u = s[ed[i].fi], v = s[ed[i].se];
  105. if(u == v) {
  106. ok[u] = 1;
  107. continue;
  108. }
  109. add(u, v);
  110. add(v, u);
  111. }
  112. int ans = 0;
  113. for(int i = 1; i <= cnt; i++) {
  114. if(!vis[i]) {
  115. ans += bfs(i);
  116. }
  117. }
  118. cout<<ans<<endl;
  119. return 0;
  120. }

codeforces 659E . New Reform 强连通的更多相关文章

  1. CodeForces 659E New Reform

    题意:给你一个无向图,如今要求你把边改成有向的. 使得入度为0的点最少,输出有多少个点入度为0 思路:脑补一波结论.假设有环的话显然没有点入度为0,其余则至少有一个点入度为0,然后就DFS一波就能够了 ...

  2. Codeforces 659E New Reform【DFS】

    题目链接: http://codeforces.com/problemset/problem/659/E 题意: 给定n个点和m条双向边,将双向边改为单向边,问无法到达的顶点最少有多少个? 分析: 无 ...

  3. CodeForces 659E New Reform (图的遍历判环)

    Description Berland has n cities connected by m bidirectional roads. No road connects a city to itse ...

  4. [图中找环] Codeforces 659E New Reform

    New Reform time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  5. codeforces 659E E. New Reform(图论)

    题目链接: E. New Reform time limit per test 1 second memory limit per test 256 megabytes input standard ...

  6. Codeforces 732F. Tourist Reform (Tarjan缩点)

    题目链接:http://codeforces.com/problemset/problem/732/F 题意: 给出一个有n个点m条边的无向图,保证联通,现在要求将所有边给定一个方向使其变成有向图,设 ...

  7. Codeforces 1027D Mouse Hunt (强连通缩点 || DFS+并查集)

    <题目链接> 题目大意: 有n个房间,每个房间都会有一只老鼠.处于第i个房间的老鼠可以逃窜到第ai个房间中.现在要清理掉所有的老鼠,而在第i个房间中防止老鼠夹的花费是ci,问你消灭掉所有老 ...

  8. CodeForces 732F Tourist Reform

    边双连通分量. 这题有一点构造的味道.一个有向图,经过强连通缩点之后会形成一个有向无环图. 如果将最大的强连通分量放在顶端,其余的强连通分量都直接或间接指向他,那么这样就构造出了符合要求的图. 接下来 ...

  9. CodeForces 723E One-Way Reform

    构造. 有一种十分巧妙的方法可以使图中所有度数为偶数的节点,经过每条边定向后,出度和入度都相等. 首先统计每个节点的度数,将度数为奇数的节点与编号为$n+1$的节点连边,这样一来,这张新图变成了每个节 ...

随机推荐

  1. Import MySQL Dumpfile, SQL Datafile Into My Database

    How can I import a MySQL dumpfile into my database? I'm using CentOS Linux 5 server. My old hosting ...

  2. adb server didn t ack failed to start daemon

    关掉Ecilpse,打开cmd命令行 1)cd到sdk的platform-tools目录下, 2)执行  adb kill-server  ,出现  server not runing 提示 3)执行 ...

  3. winow.open打开窗口被拦截的解决方法

    自己遇到的使用window.open打开新窗口被拦截的几种情况(使用的chrome浏览器,其他浏览器未测): 第一次:window.open("www.baidu.com"),打开 ...

  4. 读取hdfs文件内容

    基础环境: cdh2.71 需要注意: url地址参照 <property> <name>dfs.namenode.servicerpc-address</name> ...

  5. HDU 1829 - A Bug's Life

    Problem Description Background Professor Hopper is researching the sexual behavior of a rare species ...

  6. OpenAL

    http://blog.csdn.net/luckilyyu/article/details/6894707

  7. 下拉条的连动-ajax方式

    客户端触发: <select id="category1" onchange="changecategory()">    <option v ...

  8. Android_神奇的android:clipChildren属性

    正文 一.效果图 看到这个图时你可以先想想如果是你,你怎么实现这个效果.马上想到用RelativeLayout?NO,NO,NO,,, 二.实现代码 <?xml version="1. ...

  9. linux判断日期是否合法

    #include <time.h> #include <stdio.h> typedef enum { , } bool; bool check_date(int year, ...

  10. [WPF]解决ListView在没有Items时,水平滚动条不出现的问题

    转载地址:http://www.cnblogs.com/nankezhishi/archive/2010/03/19/FixListViewNotScrollHeaderBug.html 在上一篇Bl ...