일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 알고리즘
- 크루스칼
- 우선 순위 큐
- 세그먼트 트리
- 문자열
- 다익스트라
- 2023
- dropout
- BFS
- NEXT
- tensorflow
- 미래는_현재와_과거로
- back propagation
- dfs
- 분할 정복
- pytorch
- lazy propagation
- 이분 탐색
- object detection
- 회고록
- 조합론
- 플로이드 와샬
- 가끔은 말로
- 자바스크립트
- c++
- DP
- 가끔은_말로
- 백트래킹
- Overfitting
- 너비 우선 탐색
Archives
- Today
- Total
Doby's Lab
백준 11266번: 단절점 (C++, Resolve) 본문
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
Solved By: Articulation
Articulation 구현에 대해 아쉬운 점이 한 가지 있었습니다. 바로 minOrder 부분이 이해가 되지 않는 것이었는데
minOrder를 주석에 달아두었듯이
'Now Node의 *Child Node로써 갈 수 있는 Node* 중 가장 일찍 방문한 Node'라고 생각하면 쉽습니다.
(이 말도 100% 이해를 하기에는 애매한 말이기는 합니다.)
(이렇게 인지한 부분이 바뀌면서 기존의 변수명이 childOrder였던 변수가 childMinOrder로 변경되었습니다.)
#include <iostream>
#include <vector>
#define MAX 10001
using namespace std;
int v, e;
vector<int> adj[MAX];
int visitedOrder[MAX];
bool isCut[MAX];
int order = 0;
// minOrder = Now Node의 *child Node가 갈 수 있는 Node* 중 가장 일찍 방문한 Node
// Now Node의 Child Node가 갈 수 있는 Node라는 점을 인지하여
// Now Node를 지나가지 않는 Node 중 가장 일찍 방문한 Node라고 생각하면 쉽다.
// == Child Node
// Child Node이기 때문에 Now Node를 돌아가서 더 빠르게 방문한 Node가 존재할 수 있는 것이다.
int dfs(int now, bool isRoot){
int minOrder = visitedOrder[now] = ++order;
int child = 0;
for(int i = 0; i < adj[now].size(); i++){
int next = adj[now][i];
if(visitedOrder[next]){
minOrder = min(minOrder, visitedOrder[next]);
continue;
}
child++;
int childMinOrder = dfs(next, false);
if(!isRoot && visitedOrder[now] <= childMinOrder){
isCut[now] = true;
}
minOrder = min(minOrder, childMinOrder);
}
if(isRoot){
isCut[now] = (child >= 2);
}
return minOrder;
}
int main(){
cin >> v >> e;
for(int i = 0; i < e; i++){
int a, b; cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
for(int i = 1; i <= v; i++){
if(!visitedOrder[i]){
dfs(i, true);
}
}
int res = 0;
for(int i = 1; i <= v; i++){
if(isCut[i]) res++;
}
cout << res << '\n';
for(int i = 1; i <= v; i++){
if(isCut[i]) cout << i << ' ';
}
}
728x90
'PS > BOJ' 카테고리의 다른 글
백준 10292번: Man in the Middle (C++) (0) | 2022.07.09 |
---|---|
백준 4195번: 친구 네트워크 (C++) (0) | 2022.07.09 |
백준 17204번: 죽음의 게임 (Python) (0) | 2022.07.07 |
백준 11265번: 끝나지 않는 파티 (C++) (0) | 2022.07.05 |
백준 17485번: 수강 과목 (C++) (0) | 2022.07.04 |