挑战程序设计竞赛(算法和数据结构)——15.3 关节点的JAVA实现

Posted 小乖乖的臭坏坏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挑战程序设计竞赛(算法和数据结构)——15.3 关节点的JAVA实现相关的知识,希望对你有一定的参考价值。

题目:


代码:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class ArticulationPoint 
    public static void main(String[] args) 
        Scanner cin = new Scanner(System.in);
        int N = cin.nextInt();
        int m = cin.nextInt();
        ArrayList<Integer> G[] = new ArrayList[N];
        int[] prenum = new int[N];
        int[] parent = new int[N];
        int lowest[] = new int[N];
        boolean visited[] = new boolean[N];
        for (int i=0;i<N;i++)
            G[i] = new ArrayList<>();
        
        for (int i=0;i<m;i++)
            int s = cin.nextInt();
            int t = cin.nextInt();
            G[s].add(t);
            G[t].add(s);
        

        art_point(N, visited, prenum, parent, lowest,G);
    

    public static void art_point(int N, boolean[] visited, int[]  prenum, int[]  parent, int[]  lowest, ArrayList<Integer> G[])
        int timer = 1;
        //计算lowest
        dfs(0, -1, visited, prenum, parent, lowest, timer, G);//0==root

        HashSet<Integer> ap = new HashSet<Integer>();
        int np = 0;
        for (int i=1;i<N;i++)
            int p = parent[i];
            if(p==0)np++;
            else if(prenum[p]<=lowest[i])ap.add(p);
        
        if(np>1)ap.add(0);
        for (int element : ap)
            System.out.println(element);
        
    

    public static void dfs(int current, int prev, boolean[] visited, int[]  prenum, int[]  parent, int[]  lowest, int timer, ArrayList<Integer> G[])
        //访问节点current之后立刻执行的处理;current为当前节点,prev为上一节点
        //让当前节点的顺序prenum和比较直lowest设置为timer。
        prenum[current] = lowest[current] = timer;
        //timer值增加
        timer++;

        //当前节点状态设置为已被访问过了
        visited[current] = true;

        //定义下一节点
        int next;

        //针对当前节点的所有邻接点
        for (int i=0;i<G[current].size();i++)
            next = G[current].get(i);//next为current的邻接点
            if(!visited[next])//如果邻接点没有被访问过
                //即将通过节点current访问节点next时执行的处理
                parent[next] = current;//先将next的父节点设置为current

                //对下一个几点next执行dfs操作
                dfs(next, current, visited, prenum, parent, lowest, timer, G);

                //节点next搜索完毕之后立刻执行的处理
                lowest[current] = Math.min(lowest[current], lowest[next]);
            else if(next!=prev)//如果邻接点被访问过但下一个节点不等于
                //边current-->next为Back-edge时的处理
                lowest[current] = Math.min(lowest[current], prenum[next]);
            
        
        //节点current搜索完毕之后立刻执行的处理
    

输入1:

4 4
0 1
0 2
1 2
2 3

输出1:

2

输入2:

8 10
0 1
1 2
0 2
0 3
2 3
3 4
3 5
5 6
5 7
6 7

输出2:

3
5

输入3:

8 10
0 1
0 2
1 2
1 3
2 3
3 4
4 6
4 7
4 5
5 7

输出3:

3
4

以上是关于挑战程序设计竞赛(算法和数据结构)——15.3 关节点的JAVA实现的主要内容,如果未能解决你的问题,请参考以下文章

挑战程序设计竞赛(算法和数据结构)——15.5最小生成树(Kruskal算法)的JAVA实现

挑战程序设计竞赛(算法和数据结构)——分割(下)&快速排序的JAVA实现

挑战程序设计竞赛(算法和数据结构)——19.2九宫格拼图问题的JAVA实现

挑战程序设计竞赛(算法和数据结构)——7.1归并排序JAVA实现

挑战程序设计竞赛(算法和数据结构)——16.13线段相交问题(曼哈顿算法)的JAVA实现

挑战程序设计竞赛(算法和数据结构)——3.6希尔排序的JAVA实现