CutVertexBridge.cpp 685 B

12345678910111213141516171819202122232425262728293031
  1. int dfs_clock = 0;
  2. int iscut[maxn];
  3. int low[maxn], pre[maxn];
  4. //appeler: dfs(u, -1).
  5. //Initialisation:
  6. // memset(pre, 0, sizeof(pre));
  7. // memset(iscut, false, sizeof(iscut);
  8. //Complexite: O(n+m)
  9. int dfs(int u, int fa){ // u's father is fa.
  10. int lowu = pre[u] = ++dfs_clock;
  11. int child = 0;
  12. for (int i = 0; i < G[u].size(); i++){
  13. int v = G[u][i];
  14. if (!pre[v]) {
  15. child ++;
  16. int lowv =dfs(v, u);
  17. lowu = min(lowu, lowv);
  18. //if (lowv > pre[u]) { isbridge[u][v] = true; }
  19. if (lowv >= pre[u]){
  20. iscut[u] = true;
  21. }
  22. }
  23. else if (pre[v] < pre[u] && v != fa){
  24. lowu = min(lowu, pre[v]);
  25. }
  26. }
  27. if (fa < 0 && child == 1) iscut[u] = 0;
  28. low[u] = lowu;
  29. return lowu;
  30. }