문제 - https://www.acmicpc.net/problem/11266

 

11266번: 단절점

첫째 줄에 두 정수 V(1≤V≤10,000), E(1≤E≤100,000)가 주어진다. 이는 그래프가 V개의 정점과 E개의 간선으로 이루어져 있다는 의미이다. 다음 E개의 줄에는 간선에 대한 정보를 나타내는 두 정수 A, B

www.acmicpc.net

import java.io.*;
import java.util.*;

public class Main {

    static int V, E;
    static ArrayList<Integer>[] tree;
    static Set<Integer> answer;
    static int[] order;

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        V = Integer.parseInt(st.nextToken());
        tree = new ArrayList[V+1];
        for (int i = 1; i <= V; i++)
            tree[i] = new ArrayList<>();

        E = Integer.parseInt(st.nextToken());
        for (int i = 0; i < E; i++) {
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            tree[a].add(b);
            tree[b].add(a);
        }

        order = new int[V+1];
        answer = new HashSet();
        for (int i = 1; i <= V; i++)
            if (order[i]==0)
                dfs(i, true, 0);

        ArrayList<Integer> tmp = new ArrayList<>(answer);
        Collections.sort(tmp);
        bw.write(tmp.size()+"\n");
        for (int item : tmp)
            bw.write(item+" ");

        bw.flush();
        bw.close();
        br.close();
    }
    static int cnt=1;
    static int dfs(int id, boolean isRoot, int parent){
        order[id] = cnt++;
        int ret = order[id];
        int child = 0;
        for (int now : tree[id]) {
            if (now == parent) continue;
            
            if (order[now]==0){
                child++;
                int low = dfs(now, false, id);
                if (!isRoot && low >= order[id])
                    answer.add(id);
                ret = Math.min(ret, low);
            } else
                ret = Math.min(ret, order[now]);
        }
        if (isRoot && child>=2)
            answer.add(id);
        return ret;
    }
}

단순union이 아니라 dfs를 이용해서 그래프에서 사이클이 없는지 탐색하는 부분이 잘 이해가 안된다..

조금 더 꼼꼼히 뜯어볼 필요가 있을것같다.

'공부 > algorithm' 카테고리의 다른 글

BOJ 타임머신(11657) - Java  (0) 2021.08.09
BOJ 최단경로(1753) - Java  (0) 2021.08.09
BOJ 도로 네트워크(3176) - Java  (0) 2021.08.06
BOJ 교수님은 기다리지 않는다(3830) - Java  (0) 2021.08.05
BOJ 게임 개발(1516) - Java  (0) 2021.08.04

+ Recent posts