문제 - 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 |