[关闭]
@laofang 2016-07-03T02:41:40.000000Z 字数 1263 阅读 757

求桥

c++


来源: http://www.cnblogs.com/cchun/archive/2012/08/18/2645077.html

  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdio>
  4. #include <algorithm>
  5. #include <utility>
  6. #include <cstring>
  7. using namespace std;
  8. typedef struct _node
  9. {
  10. int v, id, num;
  11. _node():num(0) {};
  12. }N;
  13. const int MAX = 10005;
  14. vector<N> vec[MAX];
  15. int dfn[MAX], low[MAX], step, id;
  16. int ans[MAX * 10], cnt;
  17. void addEdge(int u, int v)
  18. {
  19. bool flag = false;
  20. for(unsigned i = 0; i < vec[u].size(); i++)
  21. {
  22. if(vec[u][i].v == v)
  23. {
  24. flag = true;
  25. vec[u][i].num++;
  26. for(unsigned j = 0; j < vec[v].size(); j++)
  27. {
  28. if(vec[v][j].v == u)
  29. {
  30. vec[v][j].num++;
  31. break;
  32. }
  33. }
  34. id++;
  35. break;
  36. }
  37. }
  38. if(flag == false)
  39. {
  40. N tmp;
  41. tmp.v = v, tmp.id = id++;
  42. tmp.num = 1;
  43. vec[u].push_back(tmp);
  44. tmp.v = u;
  45. vec[v].push_back(tmp);
  46. }
  47. }
  48. void tarjan(int father, int n)
  49. {
  50. dfn[n] = low[n] = ++step;
  51. for(unsigned i = 0; i < vec[n].size(); i++)
  52. {
  53. int son = vec[n][i].v;
  54. if(dfn[son] == -1)
  55. {
  56. tarjan(n, son);
  57. low[n] = min(low[n], low[son]);
  58. }
  59. else if(son != father)
  60. low[n] = min(low[n], dfn[son]);
  61. }
  62. if(dfn[n] == low[n])
  63. {
  64. int son = n;
  65. n = father;
  66. for(unsigned k = 0; k < vec[n].size(); k++)
  67. {
  68. if(son == vec[n][k].v)
  69. {
  70. if(vec[n][k].num == 1)
  71. {
  72. ans[cnt++] = vec[n][k].id;
  73. }
  74. break;
  75. }
  76. }
  77. }
  78. }
  79. void init()
  80. {
  81. id = 1;
  82. step = cnt = 0;
  83. for(int i = 0; i < MAX; i++)
  84. {
  85. vec[i].clear();
  86. dfn[i] = low[i] = -1;
  87. }
  88. }
  89. int main(void)
  90. {
  91. int n, m;
  92. while(std::cin >> n >> m)
  93. {
  94. init();
  95. for(int i = 0; i < m; i++)
  96. {
  97. int u, v;
  98. std::cin >> u >> v;
  99. addEdge(u, v);
  100. }
  101. dfn[1] = low[1] = ++step;
  102. tarjan(1, 1);
  103. std::cout << cnt << std::endl;
  104. }
  105. return 0;
  106. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注