1. Graph(๊ทธ๋ํ) ์๋ฃ๊ตฌ์กฐ
*์ฉ์ด์ ๋ฆฌ
G = (V, E) (์ ์ Node, Vertex / ๊ฐ์ Edge)
- ๊ฒฝ๋ก(์์์ ๊ณผ ๋์ฐฉ์ ์ด ๋ค๋ฅผ ๊ฒฝ์ฐ), ์ฌ์ดํด(์์์ ๊ณผ ๋์ฐฉ์ ์ด ๊ฐ์ ๊ฒฝ์ฐ)
cf) ๋จ์๊ฒฝ๋ก/๋จ์ ์ฌ์ดํด: ๊ฐ์ ์ ์ ์ ๋ ๋ฒ ์ด์ ๋ฐฉ๋ฌธํ์ง ์๋ ๊ฒฝ๋ก/์ฌ์ดํด
- ๋ฐฉํฅ์ด ์๋ ๊ทธ๋ํ/๋ฐฉํฅ์ด ์๋ ๊ทธ๋ํ
- ๊ฐ์ค์น: ๊ฐ์ ์ ๋น์ฉ.
- ์ฐจ์(Degree): ์ ์ ๊ณผ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ๊ฐ์
cf) ๋ฐฉํฅ ๊ทธ๋ํ์ ๊ฒฝ์ฐ, In-degree, Out-degree๋ก ๋๋์ด์ ์ฐจ์๋ฅผ ๊ณ์ฐํ๋ค.
*๊ทธ๋ํ๋ฅผ ์ ์ฅํ๋ ๋ฒ
; ์ด๋ค ์ ์ x์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ ์ฐพ๊ธฐ ์ํด ์ด๋ป๊ฒ ํจ์จ์ ์ผ๋ก ์ ์ฅํ ์ง.
1) ์ธ์ ํ๋ ฌ ๋ฐฉ๋ฒ
A[i][j] = 1, A[i][j] = 0. <- ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด 1, ์ฐ๊ฒฐ์๋์ด ์์ผ๋ฉด 0
2) ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ๋ฒ
A[i] = i์ ์ฐ๊ฒฐ๋ ์ ์ ์ ๋ฆฌ์คํธ๋ก ํฌํจํจ. ๋์ ๋ฐฐ์ด(vector, ArrayList ๋ฑ)์ด ํ์ํจ.
ex) A[1] = {2, 5}, A[2] = {1, 3, 4, 5}, ...
ex) ๊ฐ์ค์น๋ ๊ฐ์ด ์ ์ฅํ ๋๋ pair๋ฅผ ์ด์ฉํด์ A[1] = { (2, 2), (5, 7) }, A[2] = { (1, 2), (3, 2), (4, 3), (5, 1) }๋ก ํํํจ. 1์์ 2๋ก ๊ฐ ๋ ๊ฐ์ค์น๊ฐ 2, 1์์ 5๋ก ๊ฐ ๋ ๊ฐ์ค์น๊ฐ 7. ์ด๋ ๊ฒ
//์ธ์ ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ ํํํ๊ธฐ
#include <iostream>
#include <vector>
using namespace std;
int main() {
int nodeNum, inputNode1, inputNode2;
cin >> nodeNum;
vector<int> *graph = new vector<int>[nodeNum + 1];
//Input
for (int i = 0; i < nodeNum - 1; i++) {//edge์ ๊ฐ์๋ node์ ๊ฐ์ - 1.
cin >> inputNode1 >> inputNode2;
graph[inputNode1].push_back(inputNode2);
graph[inputNode2].push_back(inputNode1);
}
delete[] graph;
return 0;
}
//์ธ์ ๋ฆฌ์คํธ์ ๊ฐ์ค์น๋ ์ ์ฅํ๋ ๋ฒ
#include <iostream>
#include <vector>
using namespace std;
int main() {
int nodeNum, inputNode1, inputNode2, weight;//๋
ธ๋์, ๋
ธ๋1, ๋
ธ๋2, ๊ฐ์ค์น
cin >> nodeNum;
//๋
ธ๋๊ฐ์๋งํผ pair ์ธ์ ๋ฆฌ์คํธ ์์ฑ
vector<pair<int, int>> *graph = new vector<pair<int, int>> [nodeNum + 1];
//๊ฐ ์
๋ ฅ
for (int i = 1; i < nodeNum; i++) {
cin >> inputNode1 >> inputNode2 >> weight;
graph[inputNode1].push_back(make_pair(inputNode2, weight));
graph[inputNode2].push_back(make_pair(inputNode1, weight));
}
delete[] graph;
return 0;
}
*์ธ์ ํ๋ ฌ/์ธ์ ๋ฆฌ์คํธ ๊ณต๊ฐ ๋ณต์ก๋
1) ์ธ์ ํ๋ ฌ: O(V^2)
2) ์ธ์ ๋ฆฌ์คํธ: O(E)
๊ณต๊ฐ๋ณต์ก๋๋ก๋ง ๋ณด๋ฉด ์ธ์ ํ๋ ฌ์ด ํจ์ฌ ์ข์. ํ์ง๋ง ์ธ์ ํ๋ ฌ์ด ์ข์ ๋๋ ์์.
์๋ฅผ ๋ค์ด, u, v๊ฐ ์์ ๋, u->v๊ฐ ์กด์ฌํ๋์ง๋ฅผ ์์๋ณด๋ ค๋ฉด O(1)์ ์๊ฐ์ผ๋ก ์ ์ ์์. A[u][v]๋ง ํ์ธํ๋ฉด ๋๊ธฐ ๋๋ฌธ.
๋ฐ๋ฉด์ ์ธ์ ๋ฆฌ์คํธ๋ A[u] = { 0, 0, 0, ...} ๋ก ํํ๋๊ธฐ ๋๋ฌธ์ ์์ ํ๋ํ๋๋ฅผ ๋ค ์ฐพ์๋ด์ผ ํจ. ๊ทธ๋์ O(์ฐจ์) ๊ฐ ๊ฑธ๋ฆผ.
๋ํ, ๋ชจ๋ ์ ์ ์ด ์ฐ๊ฒฐ๋ ์์ ๊ทธ๋ํ์ผ ๋๋ ์ธ์ ํ๋ ฌ์ ์จ๋ ๊ณต๊ฐ๋ณต์ก๋๊ฐ ๋์ผํ๋ค.
2. Tree(ํธ๋ฆฌ) ์๋ฃ๊ตฌ์กฐ
: ๋ฃจํ๋ฅผ ๊ฐ์ง์ง ์๋ ๊ทธ๋ํ. ๋ ธ๋๋ค์ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐํ ๊ณ์ธตํ ์๋ฃ๊ตฌ์กฐ.
Tree | Graph |
๋ ์ ์ ์ฌ์ด์ ํ๋์ ๊ธธ๋ง ์กด์ฌ ํ๋์ ๋ฃจํธ ๋ ธ๋๊ฐ ์กด์ฌ ๋ฃจํ๊ฐ ํ์ฉ๋์ง ์์ ๊ณ์ธต์ ๋ชจ๋ธ |
๋ ์ ์ ์ฌ์ด์ ๋ ์ด์์ ๊ฒฝ๋ก๊ฐ ํ์ฉ๋จ ๋ฃจํธ ๋ ธ๋๊ฐ ์์ ๋ฃจํ๊ฐ ์์ ์ ์์ ํ๋ก๋ง ๋ชจ๋ธ |
* ์ฉ์ด์ ๋ฆฌ
- Edge(๊ฐ์ ): ๋ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ์
- Level: ๋ ธ๋๊ฐ ์ํ ํธ๋ฆฌ์ ๊น์ด. ๋ฃจํธ๋ ธ๋์ ๋ ๋ฒจ 0, ๊ทธ ๋ค์ ์์ ๋ ธ๋๋ถํฐ +1 Level
- Degree(์ฐจ์): ํ ๋ ธ๋๊ฐ ๊ฐ์ง ์์์ ์. ex) ์ ๊ทธ๋ฆผ์์ A๋ ธ๋์ Degree๋ 2๊ฐ.
- Depth: ํธ๋ฆฌ์ ์ต๋ ๋ ๋ฒจ(๋์ด). ๋ฃจํธ ๋ ธ๋๋ถํฐ์ ๊ฑฐ๋ฆฌ.
- Terminal Node: Degree(์ฐจ์)๊ฐ 0์ธ ๋ ธ๋. ํฐ๋ฏธ๋ ๋ ธ๋์ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ ์ธํ ๋๋จธ์ง๋ฅผ ๋นํฐ๋ฏธ๋ ๋ ธ๋๋ผ๊ณ ๋ถ๋ฆ.
- ๋ถ๋ชจ๋ ธ๋: ๋ ธ๋์ ์ฐ๊ฒฐ๋ ํ๋จ๊ณ ์์ ๋ ๋ฒจ์ ๋ ธ๋. ex) B์ ๋ถ๋ชจ๋ ธ๋: A
- ์์๋ ธ๋: ๋ ธ๋์ ์ฐ๊ฒฐ๋ ์๋ธํธ๋ฆฌ์ ๋ฃจํธ๋ ธ๋๋ค. ex) A์ ์์ ๋ ธ๋: B,C
- ํ์ ๋ ธ๋: ๋ถ๋ชจ๊ฐ ๊ฐ์ ๋ ธ๋. ex) B, C
* ๊ตฌํ๋ฐฉ๋ฒ์ Graph์ ๊ฐ์.
์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ ๊ฐ์ค์น์๋ Tree, ์ธ์ ๋ฆฌ์คํธ์ pair๋ฅผ ์ด์ฉํ ๊ฐ์ค์น ์๋ Tree.