์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ(Biconnect Component)๋?
์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ์ด๋, ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ ์ฐ๊ฒฐ ์ฑ๋ถ์์ ์์์ ๋ ์ ์ฌ์ด์ ์ ์ด๋ ๋ ๊ฐ์ ๋จ์ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ ์ฐ๊ฒฐ ์ฑ๋ถ์ ๋ปํ๋ค.
์ด๋, ์ฐ๊ฒฐ ์ฑ๋ถ์ด๋ ๊ทธ๋ํ์์ ์๋ก ์ฐ๊ฒฐ๋์ด ์๋ ์ ์ ๋ค์ ๋งํ๋ค. ์๋ฅผ ๋ค์ด, [1, 2, 3, 4, 5], [6, 7], [8, 9, 10]๋ 3๊ฐ์ ์ฐ๊ฒฐ ์ฑ๋ถ์ผ๋ก ๊ตฌ์ฑ๋์๋ค๊ณ ๋ณผ ์ ์๋ค. ๋ํ ๋จ์ ๊ฒฝ๋ก๋, ๊ฒฝ๋ก ์์ ์ ์ ์ด ๋ชจ๋ ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ๋งํ๋ค.
์ฆ, ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ์ด๋, ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ ์ฐ๊ฒฐ๋์ด ์๋ ์ ์ ๋ฆฌ์คํธ์ธ๋ฐ, ์ด ๋ฆฌ์คํธ์ ์์์ ๋ ์ ๊ฐ์ ๊ฒฝ๋ก ์์ ์์ด์ ์ ์ ์ด ์ค๋ณต๋์ง ์๋ ๊ฒฝ๋ก๊ฐ ๋ ๊ฐ์ด์ ์กด์ฌํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์๋ ์์์ ํจ๊ป ๊ทธ ์๋ฏธ๋ฅผ ํ ๋ฒ ๋ ์ดํด๋ณด์.
์ ๊ทธ๋ํ๋ ์ง๊ธ๊น์ง ์ดํด๋ณธ ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ์ ๊ฐ๋ ์ ์ํ๋ฉด, 3๊ฐ์ ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ์ด ์กด์ฌํ๋ค.
[0, 1, 2, 3], [3, 5], [4, 5, 6]์ด๋ค.
์ด์ ๊ฐ ํท๊ฐ๋ฆฐ๋ค๋ฉด, ๊ฐ ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ์์ ์์์ ๋ ์ ์ฌ์ด์ ๋จ์ ๊ฒฝ๋ก๊ฐ ๋ ๊ฐ ์ด์์์ ์ง์ ํ์ธํ์. ์ฐธ๊ณ ๋ก 2๊ฐ์ ์ ์ ์ผ๋ก ๊ตฌ์ฑ๋ 3, 5๋ ๋จ์ ๊ฒฝ๋ก๊ฐ ๋๊ฐ๋ผ๊ณ ์ทจ๊ธํ๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์๋ก์ด ์ฉ์ด๋ฅผ ์ ์ํ ์ ์๋ค.
์ฐ์ , ๋จ์ ์ ์ (Cut point, Articulation Point)์ด๋ค. ์ด ๊ทธ๋ํ์์ ์ฐ๊ฒฐ ์ฑ๋ถ์ ์ ์ ์ค, ํ๋์ ์ ์ ์ ์ญ์ ํ์ ๋ ๋ ๊ฐ ์ด์์ ์ฐ๊ฒฐ ์ฑ๋ถ์ผ๋ก ๋ถ๋ฆฌ๋ ๋์ ์ ์ ์ ์๋ฏธํ๋ค.
์ ๊ทธ๋ํ์์ 3๊ณผ 5๊ฐ ๊ฐ๊ฐ ๋จ์ ์ ์ ์ด๋ค. ์ข์ธก์ [0, 1, 2] ์ฐ์ธก์ [4, 5, 6]๊ณผ ๊ฐ์ด ๋ ๊ฐ์ ์ฐ๊ฒฐ ์ฑ๋ถ์ผ๋ก ๋๋๋ ๊ฒ์ ์ง์ ํ์ธํด ๋ณด๋ฉด ์ด๋ฅผ ์ ์ ์๋ค.
๋ค์์ผ๋ก ๋ค๋ฆฌ ๊ฐ์ (Bridge)์ด๋ค. ์ด๋ ๊ฐ์ ์ ์ ๊ฑฐํ์ ๋, ๋ ๊ฐ ์ด์์ ์ฐ๊ฒฐ ์ฑ๋ถ์ผ๋ก ๋ถ๋ฆฌ๋ ๋ ์ญ์ ๋ ๊ฐ์ ์ ๋งํ๋ค.
์ด์ , ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ์ด ์ด๋ค ๊ฒ์ธ์ง ์ดํด๋ณด์์ผ๋, ์ด๋ค ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํํ ์ ์๋ ์ง ํ์ธํด๋ณด์.
์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ(Biconnect Component)๊ตฌํ์ ์ํ DFS
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด, ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ์ ๋จ์ ์ ์ ์ ํ์ธ๊ณผ ํน์ ์ ์ ์ ํตํด ์ด์ด์ง ๋ชจ๋ ์ ์ ์ ํ์ํ๊ณ ๋์์์ ๋, ์ด๋ฅผํตํด ์ฐพ๊ณ ์ถ๋ ฅ ๊ฐ๋ฅํ๋ค.
๊ทธ ๊ณผ์ ์ ์ดํดํ๊ธฐ ์ํด ์๋ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํด๋ณด์.
์ฌ๊ธฐ์ ๊ฐ์ ๋ค์ ์๋ก ์ด์ด์ ธ ์๋๋ฐ, ์ด๋ ์ฌ์ดํด์ ์์ฑํ๋ ๊ฐ์ ์ด ์กด์ฌํ๋ค.
์ด๋ฅผ ๋ท๊ฐ์ ์ด๋ผ๊ณ ํ๋๋ฐ, ๋ท๊ฐ์ (2, 0)์ ์ฌ์ดํด [0, 3, 2, 0]์ ์์ฑํ๊ณ , ๋ท๊ฐ์ (1, 0)์ ์ฌ์ดํด [0, 3, 2, 1, 0]์ ์์ฑํ๋ค. ๋ํ ๋ท๊ฐ์ (6, 5)๋ ์ฌ์ดํด [5, 4, 6, 5]๋ฅผ ์์ฑํ๋ค.
์ด์ฒ๋ผ ๋ท๊ฐ์ ์ ํตํด ๋ง๋ค์ด์ง ์ฌ์ดํด ์์ ์ ์ ๋ค์ ํ๋์ ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ์ ์ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํ์.
์ด๋ฌํ ์ฌ์ดํด์ ์ญํ ์ ์ฌ์ดํด ์์ ์์๋ค์ ๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ฃผ๋ ์ญํ ์ ํ๋ค. ์ฌ์ดํด์ด ์ผ์ชฝ ๊ทธ๋ฆผ์ฒ๋ผ ์ฌ์ดํด์ด ๊ฒน์ณ์ง๋๋ผ๋, ๊ฒฐ๊ตญ์ ํ๋์ ์ด์ค ์ฐ๊ฒฐ ์์์ด๋ฏ๋ก, ๊ฐ์ ๊ทธ๋ฃน์ ์ํ ์ ์๋๋ก ๋ง๋ค์ด์ง๋ค.
์ฌ์ดํด์ ํ์ฑํ๋ ๊ฒ ์ด์ธ์ ์ค์ง์ ์ผ๋ก ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ์ ์ฐพ๋ ์กฐ๊ฑด์ ๋ฐ๋ก ๋จ์ ์ ์ ์ฐพ๊ธฐ์ด๋ค.
์์ ๋งํ๋ฏ์ด ๋จ์ ์ ์ ์ ๋ ๊ฐ ์ด์์ ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ์ผ๋ก ๋๋์ด์ฃผ๋ ์ ์ ์ ๋งํ๋ค. ์ด๋ ๊ณง ๋จ์ ์ ์ ์ ์ฐพ๋๋ค๋ฉด, ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ์ ๊ตฌ๋ถ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
์๋ ์์๋ ์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๊ทธ๋ํ๋ก ๋ํ๋ธ ๊ฒ์ด๋ค.
๊ฒฐ๊ตญ DFS๋ฅผ ์ํํ๋ฉฐ, ์ฌ์ฉํ๋ ๊ฐ์ ์ ์คํ ์๋ฃ ๊ตฌ์กฐ์ ์ ์ฅํ๊ณ , ๋ท๊ฐ์ ์ ํตํด์ ์ฌ์ดํด์ ๋ง๋ ๋ค. ์ฌ์ดํด์ ์์ ์๋ ๋ชจ๋ ์ ์ ๋ค์ ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ์ ์์๋ค์ด๋ฉฐ, ์ฌ๋ฌ ๊ฐ์ ์ฌ์ดํด์ด ์๊ธฐ๋๋ผ๋ ๊ฐ์ ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ ๋ด์์๋ ๊ฐ์ ๊ฐ๋ง ์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด ํฐ ์๊ด์ด ์๋ค.
๊ฐ์ ๊ฐ์ ๋ํด์๋ ๋ค์์ ์ค๋ช ํ๊ฒ ๋ค.
์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ(Biconnect Component)๊ตฌํ
์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ ์๊ณ ๋ฆฌ์ฆ์ DFS๋ฅผ ์ํํ๋ฉฐ, ๋ฐฉ๋ฌธ ๋ฒํธ (dfsnum) ์ ๋งค๊ธด๋ค. ์ด๋ฅผ ํตํด ๋ฐฉ๋ฌธ ์์๋ฅผ ์ฒดํฌํ ์ ์๋๋ฐ ์์์ ๋งํ ๊ฐ์ ๊ฐ์ ์ด dfsnum์ ๋๋ ๊ฒ์ด๋ค.
๊ฒฐ๊ตญ ๊ฐ์ฅ ์์ dfsnum์ ๊ฐ์ง ์ ์ ์ ๋๋ฌํ ์ ์๋์ ์ฌ๋ถ๋ฅผ ๋ฐ์ง๋ ์ ์ด ๋๋๋ฐ, ์ด๋ฅผ ํ์ํ๊ธฐ ์ํด lownum์ด๋ผ๋ ๋ฐฐ์ด์ ์ฌ์ฉํด์ผ ํ๋ค.
๋ค์๋งํด dfsnum์ ๋ฐฉ๋ฌธ์์(1, 2, 3, 4, 5...)๋ฅผ ๋ํ๋ธ ๊ฒ์ด๊ณ , lownum์ ๋จ์ ์ ์ ์ ๋๋ฌํ๊ธฐ ๊น์ง ๊ฐ์ dfsnum์ผ๋ก ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ์ ๊ตฌ๋ถํ๊ธฐ ์ํด ์๋ ๊ฒ์ด๋ค. (1, 1, 1, 2, 2, 3..)
์๋๋ ์๋ฐ ์ธ์ด๋ก ๊ตฌํ๋ Biconnect Component ์์์ด๋ค.
class BiconnectedComponents {
private int sequence = 1;
// ๋ฐฉ๋ฌธ ์์ ๋ฐฐ์ด
private int[] dfsnum;
// ์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ ๊ตฌ๋ถ์ฉ
private int[] lownum;
private List<List<Integer>> graph;
private Stack<Edge> edgeStack;
class Edge {
int u, v;
public Edge(int u, int v) {
this.u = u;
this.v = v;
}
}
// ์ด๊ธฐํ
public BiconnectedComponents(int n) {
dfsnum = new int[n];
lownum = new int[n];
graph = new ArrayList<>();
edgeStack = new Stack<>();
for (int i = 0; i < n; i++) {
graph.add(new ArrayList<>());
}
}
public void addEdge(int u, int v) {
graph.get(u).add(v);
graph.get(v).add(u);
}
// ์์ ๋จ์ด์ ธ ์๋ ์ฐ๊ฒฐ ์ฑ๋ถ์ ์ํด ์ ๋ถ ํ์
public void find() {
for (int i = 0; i < dfsnum.length; i++) {
if (dfsnum[i] == 0) {
biconnected(i, -1);
}
}
}
public void biconnected(int v, int u) {
// v ๋ฐฉ๋ฌธ
dfsnum[v] = lownum[v] = sequence++;
// v ์ธ์ ์์ w ํ์
for (int w : graph.get(v)) {
// ๊ฐ์ ์ถ๊ฐ
if (w != u && dfsnum[w] < dfsnum[v]) {
edgeStack.push(new Edge(v, w));
}
// ์ธ์ ์์ w๊ฐ ๋ฐฉ๋ฌธ๋์ง ์์๋ค๋ฉด ์ํ
if (dfsnum[w] == 0) {
// w ๋ฐฉ๋ฌธ
biconnected(w, v);
// v์ w์ lownum ์ค ์์ ๊ฐ์ v๋ก.
lownum[v] = Math.min(lownum[v], lownum[w]);
// w๊ฐ ๋จ์ ์ ์ ์ธ ๊ฒฝ์ฐ
if (lownum[w] >= dfsnum[v]) {
System.out.println("BiconnectedComponents์ ๊ฐ ๊ฐ์ : ");
// ๊ฐ์ pop
while (true) {
Edge edge = edgeStack.pop();
System.out.println("(" + edge.u + ", " + edge.v + ")");
if (edge.u == v && edge.v == w) {
break;
}
}
}
// ์คํดํ๋ฉด ์๋๋ ๊ฒ์ด ์ w ๋ฐฉ๋ฌธ ์กฐ๊ฑด์ ํต๊ณผํ๋ค๋ ๊ฒ ์์ฒด๊ฐ ๋ท ๊ฐ์ ์ด ์๊ฒผ๋ค๋ ๋ง์
// ๋ง์ฝ ๋ท ๊ฐ์ ์ด ์๊ธด๋ค๋ฉด, v์ lownum์ ์ฌ์ค ์ ๋ท ๊ฐ์ ์ด ๊ฐ๋ฆฌํค๋ ์ ์ ์ dfsnum์ผ๋ก ์
๋ฐ์ดํธ
} else if (w != u) {
lownum[v] = Math.min(lownum[v], dfsnum[w]);
}
}
}
}
์คํ ์์์ ๊ดํด ๋ค์ํ๋ฒ ๊ทธ๋ฆผ๊ณผ ํจ๊ป ์ค๋ช ํ๊ฒ ๋ค.
bc.addEdge(0, 2);
bc.addEdge(0, 1);
bc.addEdge(0, 3);
bc.addEdge(2, 3);
bc.addEdge(1, 2);
bc.addEdge(3, 5);
bc.addEdge(5, 6);
bc.addEdge(6, 4);
bc.addEdge(4, 5);
๋ฐฉ๋ฌธ ์์ ์์ฒด๋ ์ด๋ ๊ฒ ์์ง๋ฅผ ๋ฌด์์ ๋จผ์ ๋ฃ์๋์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค. 0, 2๊ฐ ์ ์ผ ๋จผ์ ๋ฃ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
1. 0๋ถํฐ ์์ํ์ฌ 2๋ถํฐ ๊ฐ๋ค๊ณ ํ์. ์ด ๋ ์ฒ์ ๋ฐฉ๋ฌธํ๋ ์ ์ ์ ๋ํด์๋ ํญ์ edgestack์ ์ถ๊ฐ๋๋ค. ์ดํ, dfsnum = 0์ธ ์กฐ๊ฑด์ ๊ฑธ๋ ค ์ฌ๊ท์ ์ผ๋ก ๋ค์ ์ ์ ์ ๋ํ ๋ฐฉ๋ฌธ์ ์ํํ๋ค.
dfsnum[0] = lownum[0] = 1;
dfsnum[1] = lownum[1] = 1;
edge stack : [(0-2)]
2. 2์์ 3์ ์ฌ๊ท์ ์ผ๋ก ๋ค์ด๊ฐ๋ค. 3์์๋ for๋ฌธ์ผ๋ก ๋๊ฐ์ง ๋ถ๊ธฐ๊ฐ ๋๋๋ค. ์ค์ํ ๊ฒ์ for๋ฌธ ๋ถ๊ธฐ๊ฐ ์ฌ๊ท๋ณด๋ค ๋จผ์ ๋ผ๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ ๊ธฐ์ตํ๊ณ ๋ค์ ๋จ๊ณ๋ก ๊ฐ๋ณด์.
dfsnum[2] = lownum[2] = 2;
edge stack : [(2-3), (0-2)]
3. 3์์๋ ์ฒซ๋ฒ์งธ ๋ถ๊ธฐ๋ก 0์ผ๋ก ๋ค์ด๊ฐ๋ค. ์ด๋ 0์ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์ ์ด๋ฏ๋ก, dfsnum[v] == 0 ์กฐ๊ฑด์ ๊ฑธ๋ฆฌ์ง ์๊ณ ์๋์ else if ์กฐ๊ฑด์ ๊ฑธ๋ฆฌ๊ฒ ๋๋ค. ์ด ์กฐ๊ฑด์ ์ํด์, 0์ dfsnum์ผ๋ก 3์ lownum์ด ์ง์ ๋๋ค.
dfsnum[3] = lownum[3] = 3;
-> lownum[3] = dfsnum[0]์ด๋๋ฏ๋ก, 1์ด๋๋ค.
edge stack : [(3-0), (2-3), (0-2)]
4. ์ฌ๊ทํจ์์ ์ํด 3์ผ๋ก ๋ค์ ๋์์ค๊ณ ์คํํ์ง ๋ชปํ ๋ถ๊ธฐ์ธ 5๋ก ๋ฐฉ๋ฌธ์ ์ํํ๋ค.
dfsnum[5] = lownum[5] = 4;
edge stack : [(3-5) ,(3-0), (2-3), (0-2)]
5. 5์์ 6์ผ๋ก ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๊ท ๋ฐฉ๋ฌธํด์ฃผ๋ฉฐ, ๋ง์ฐฌ๊ฐ์ง๋ก 4๋ก ๋ฐฉ๋ฌธํด์ค๋ค.
dfsnum[6] = lownum[6] = 5;
dfsnum[4] = lownum[4] = 6;
edge stack : [(6, 4), (5, 6), (3-5), (3-0), (2-3), (0-2)]
6. 4์์ 5๋ฅผ ๋ฐฉ๋ฌธํ ๋๋ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์ ์ ์ด๋ฏ๋ก, ๋ท๊ฐ์ ์ด ์๊ธด๋ค. lownum์ ์ ์ฉ์์ผ์ฃผ์.
lownum[4] = dfsnum[5];
์ฆ, 4๊ฐ ์ ์ฅ๋๋ค.
edge stack : [(4, 5), (6, 4), (5, 6), (3-5), (3-0), (2-3), (0-2)]
7. ์ฌ๊ท ๋ฐฉ๋ฌธ์ ๋ง์น๊ณ , 4์์ 6์ผ๋ก ๋์์ค๋ฉฐ 6์์ 5๋ก ๋์์จ๋ค. ์ด๋ ๊ฐ lownum์ ๊ฐ์ด ์ธํ ๋๋ค.
lownum[6] = lownum[4]์ด ๋๋ค. ์ฆ, 4๊ฐ ์ ์ฅ๋๋ค.
lownum[5]๋ ์ด๋ฏธ 4๊ฐ ์ ์ฅ๋์ด ์๋ค.
edge stack : [(4, 5), (6, 4), (5, 6), (3-5), (3-0), (2-3), (0-2)]
8. lownum[5]์ dfsnum[5]๊ฐ ๊ฐ์ผ๋ฏ๋ก, lownum[w] = dfsnum[v]์ ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ค. ์ฆ, ์ถ๋ ฅ์ด ๋๋ค. (ํน์ ์ ์ ์์ ์ด์ด์ง ๋ชจ๋ ์ ์ ์ ํ์ ํ ๋์์ด)
์ถ๋ ฅ : (4, 5), (6, 4), (5, 6)
์คํ์ด break ๋ ์ ์๋ ์กฐ๊ฑด์ popํ edge์ u์ v๊ฐ ํ์ฌ v์ w์ ๊ฐ๊ณผ ๊ฐ์ ๋ ์ํํ๊ณ ๋๋ด๋ ๊ฒ์ด๋ค.
edge stack : [(3-5), (3-0), (2-3), (0-2)]
9. ๋ค์์ผ๋ก 5์์ ๋ค์ 3์ผ๋ก ์ฌ๊ทํจ์๊ฐ ๋ฐํ๋๋ฉฐ, ๋ฐ๋ก ์ถ๋ ฅ๋ฌธ์ ๊ฑธ๋ฆฌ๊ฒ ๋๋ค. ์ด๋ lownum[w] > dfsnum[v]๊ฐ ํญ์ ๋ง์กฑํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ๋ค๋ฆฌ ๊ฐ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ๋ค. (๋จ์ ์ ์ ์ผ๋ก ์ธํ ์ถ๋ ฅ)
์ถ๋ ฅ : (3, 5)
edge stack : [(3-0), (2-3), (0-2)]
10. ์ดํ, 3์์ 2๋ก ์ฌ๊ท ํจ์๊ฐ ๋ฐํ๋๋ฉฐ, lownum์ด ์ธํ ๋๋ค.
lownum[2] = lownum[3], ์ฆ ์ด์ ์ ์ค์ ํ๋ 1 ๊ฐ์ด ์ ์ฅ๋๋ค.
edge stack : [(3-0), (2-3), (0-2)]
11. 2์์๋ ๋ถ๊ธฐ๊ฐ ๋๋๋ค. ์ฆ, 1๋ก ๊ฐ๋ ๋ถ๋ถ์ผ๋ก ๊ฐ๋ค. ์ด์ ์ ๋ฐ๋ก 3์ผ๋ก ๊ฐ ๊ฒ์ ์ด๊ธฐ์ ๊ทธ๋ํ ์์ฑ ์ (2, 3)์ (1, 2)๋ณด๋ค ๋จผ์ ๋ฃ์๊ธฐ ๋๋ฌธ์ด๋ค.
dfsnum[1] = lownum[1] = 7;
edge stack : [(1, 2), (3-0), (2-3), (0-2)]
12. 1์์๋ 0์ผ๋ก ๋ฐฉ๋ฌธํ๋๋ฐ ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋ ธ๋์ด๋ฏ๋ก, lownum์ ๋ฐ๊พธ์ด ์ค๋ค.
lownum[1] = lownum[0]์ด๋ฏ๋ก 1์ด ์ ์ฅ๋๋ค.
edge stack : [(1, 0), (1, 2), (3-0), (2-3), (0-2)]
13. ์ฌ๊ท ํจ์๊ฐ ๋ค์ ๋์์ค๋ฉฐ, 2๋ก ๋์์จ๋ค. ์ดํ, 2์์ 0์ผ๋ก ๋์์จ๋ค. ์ดํ, lownum[w] = dfsnum[v] ์กฐ๊ฑด์ ๊ฑธ๋ ค ์ ๋ถ ์ถ๋ ฅํด์ค๋ค. (ํน์ ์ ์ ์์ ์ด์ด์ง ๋ชจ๋ ์ ์ ์ ํ์ ํ ๋์์ด)
์ถ๋ ฅ : (1, 0), (1, 2), (3-0), (2-3), (0-2)
์ด์ค ์ฐ๊ฒฐ ์ฑ๋ถ(Biconnect Component)์ ์ํ ์๊ฐ
DFS์ ์ํ ์๊ฐ์ด O(n+m)์ด๋ฉฐ, ์คํ์ ๊ฐ ๊ฐ์ ์ด 1๋ฒ push๋๊ณ , 1๋ฒ pop๋๋ ์๊ฐ์ด O(m)์ด๋ฏ๋ก, ์ด ์ํ ์๊ฐ์ O(n+m)์ด๋ค.
'๐ Knowledge > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST) - Kruskal, Prim, Sollin ์๊ณ ๋ฆฌ์ฆ (1) | 2023.10.14 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๊ฐ ์ฐ๊ฒฐ ์ฑ๋ถ(SCC) - Kosaraju, Tarjan ์๊ณ ๋ฆฌ์ฆ (1) | 2023.10.14 |
[์๊ณ ๋ฆฌ์ฆ] ์์ ์ ๋ ฌ์ ์ดํดํด๋ณด์. (1) | 2023.10.12 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋์จ๊ณผ ํ์ธ๋ ์๊ณ ๋ฆฌ์ฆ(union, find) (0) | 2023.09.07 |
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ํ ์ ํ์ ๊ทธ๋ํ ๋ฌธ์ ๋ค (1) | 2023.09.04 |