无向图的割点

x33g5p2x  于2022-07-04 转载在 其他  
字(1.5k)|赞(0)|评价(0)|浏览(243)

一 割点判定法则

如果x不是根节点,则 x 是割点,当且仅当在搜索树上存在 x 的一个子节点 y,满足 low[y]>=dfn[x],若 x 是割点,当且仅当在搜索树上至少存在两个子节点,满足 low[y]>=dfn[x]。

也就是说,如果不是根,且孩子的 low 值大于或等于自己的 dfn 值,则该节点就是割点;如果是根,则至少需要两个孩子满足条件。在下图中,5的子节点是7,满足 low[7] > low[5],因此 5 是割点。

二 割点判定情况

1 不是割点

1不是割点:1是根,只有一个孩子满足 low{2}>dfn[1]

2 割点是根的情况

1是割点:1是根,有两个孩子满足 low{2}>dfn[1],low[3]>dfn[1]

3 割点不是根的情况

2和3是割点:low[3]>dfn[2],low[4]=dfn[3]

三 代码

  1. package graph.targancut;
  2. import java.util.Scanner;
  3. public class TarjanCut {
  4. static final int maxn = 1000 + 5;
  5. static int n;
  6. static int m;
  7. static int head[];
  8. static int cnt;
  9. static int root;
  10. static int low[];
  11. static int dfn[];
  12. static int num;
  13. static Edge e[] = new Edge[maxn << 1];
  14. static {
  15. for (int i = 0; i < e.length; i++) {
  16. e[i] = new Edge();
  17. }
  18. }
  19. static void add(int u, int v) { // 添加一条边u--v
  20. e[++cnt].next = head[u];
  21. e[cnt].to = v;
  22. head[u] = cnt;
  23. }
  24. static void tarjan(int u, int fa) { //求割点
  25. dfn[u] = low[u] = ++num;
  26. int count = 0;
  27. for (int i = head[u]; i != 0; i = e[i].next) {
  28. int v = e[i].to;
  29. if (v == fa)
  30. continue;
  31. if (dfn[v] == 0) {
  32. tarjan(v, u);
  33. low[u] = Math.min(low[u], low[v]);
  34. if (low[v] >= dfn[u]) {
  35. count++;
  36. if (u != root || count > 1) {
  37. System.out.println(u + "是割点");
  38. }
  39. }
  40. } else
  41. low[u] = Math.min(low[u], dfn[v]);
  42. }
  43. }
  44. static void init() {
  45. head = new int[maxn];
  46. low = new int[maxn];
  47. dfn = new int[maxn];
  48. cnt = num = 0;
  49. }
  50. public static void main(String[] args) {
  51. Scanner scanner = new Scanner(System.in);
  52. n = scanner.nextInt();
  53. m = scanner.nextInt();
  54. init();
  55. int u, v;
  56. while (m-- > 0) {
  57. u = scanner.nextInt();
  58. v = scanner.nextInt();
  59. add(u, v);
  60. add(v, u);
  61. }
  62. for (int i = 1; i <= n; i++)
  63. if (dfn[i] == 0) {
  64. root = i;
  65. tarjan(1, 0);
  66. }
  67. }
  68. }
  69. class Edge {
  70. int to;
  71. int next;
  72. }

四 测试

绿色为输入,白色为输出。

高性能云服务器

精品线路独享带宽,毫秒延迟,年中盛惠 1 折起

相关文章