ย - Last update: 2023-11-18
Graph Basic
๊ทธ๋ํ๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
- ๋
ธ๋(Node): ์ ์ (Vertex)๋ผ๊ณ ๋ ํจ
- ๊ฐ์ (Edge)
๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ ์ฉ์ด๋ฅผ ์ ์ํ์.
- ๊ฒฝ๋ก(Path): ํ ๋
ธ๋์์ ๊ทธ๋ํ์ ๊ฐ์ ์ ์ง๋ ๋ค๋ฅธ ๋
ธ๋๊น์ง ๊ฐ๋ ๊ธธ
- ์ฌ์ดํด(Cycle): ์ฒ์ ๋
ธ๋์ ๋ง์ง๋ง ๋
ธ๋๊ฐ ๊ฐ์ ๊ฒฝ๋ก
- ์ฐ๊ฒฐ ๊ทธ๋ํ(Connected Graph): ๋ชจ๋ ๋
ธ๋์ ์ฐ๊ฒฐ ๊ฒฝ๋ก๊ฐ ์์ ๊ฒฝ์ฐ
- ์ปดํฌ๋ํธ(Component): ๊ทธ๋ํ์ ์ฐ๊ฒฐ๋ ๋ถ๋ถ ๋ถ๋ถ์ ์๋ฏธ
- ํธ๋ฆฌ(Tree): ์ฌ์ดํด์ด ์๋ ์ฐ๊ฒฐ ๊ทธ๋ํ
- ๋ฐฉํฅ ๊ทธ๋ํ(Directed Graph): ๊ฐ์ ์ด ์ด๋๋ฐฉํฅ์ ๊ฐ์ง
- ๊ฐ์ค ๊ทธ๋ํ(Weighted Graph): ๊ฐ์ ์ด ๊ฐ์ค์น๋ฅผ ๊ฐ์ง - ๊ธธ์ด๋ก ํด์ ๊ฐ๋ฅ
- ์ด์ ๋
ธ๋(Neighbor / Adjacent Node)
- ์ฐจ์(Degree): ์ด์ ๋
ธ๋์ ๊ฐ์
- ๊ฐ์ ์ ๊ฐ์๊ฐ
m
์ผ ๋, ์ฐจ์์ ํฉ์ ํญ์ 2m
์ด ๋๋ค.
- ๊ฐ ๊ฐ์ ์ ๊ทธ ๊ฐ์ ์ด ์๋ ๋ ๋
ธ๋์ ์ฐจ์๋ฅผ 1์ฉ ์ฆ๊ฐ์ํค๊ธฐ ๋๋ฌธ. ๋ฐ๋ผ์ ํญ์ ์ง์
- ์ ๊ท ๊ทธ๋ํ(Regular Graph): ๋ชจ๋ ๋
ธ๋์ ์ฐจ์๊ฐ ์์
d
๋ก ๊ฐ์ ๊ฒฝ์ฐ
- ์์ ๊ทธ๋ํ(Complete Graph): ๋ชจ๋ ๋
ธ๋์ ์ฐจ์๊ฐ
n-1
์ธ ๊ฒฝ์ฐ. ์ฆ, ์๋ก ๋ค๋ฅธ ๋ชจ๋ ๋ ๋
ธ๋ ์ฌ์ด์ ๊ฐ์ ์ด ์๋ ๊ฒฝ์ฐ
- ์ง์
์ฐจ์(Indegree): ๊ทธ ๋
ธ๋๋ก ํฅํ๋ ๊ฐ์ ์ ๊ฐ์
- ์ง์ถ์ฐจ์(Outdegree): ๊ทธ ๋
ธ๋์์ ์์ํ๋ ๊ฐ์ ์ ๊ฐ์
๊ทธ๋ํ์ ํํ
- ์ธ์ ๋ฆฌ์คํธ
vector<int> adj[N]
vector<pii> adj[N]
: ๊ฐ์ค ๊ทธ๋ํ์ ๊ฒฝ์ฐ
- ์ธ์ ํ๋ ฌ
- ๊ฐ์ ๋ฆฌ์คํธ(Edge List)
vector<pii> edges
- 1๊ณผ ์ ์ฌํด๋ณด์ด์ง๋ง ๋ค๋ฅด๋ค. Edge๋ง ์ ์ฅํ ๊ฒ
vector<piii> edges
: ๊ฐ์ค ๊ทธ๋ํ์ ๊ฒฝ์ฐ
๊ทธ๋ํ์ ์ํ
- DFS
vector<int> adj[N];
bool visited[N];
void dfs(int s) {
if (visited[s]) return;
visited[s] = true;
for(auto u: adj[s]) {
dfs(u);
}
}
-
BFS
๋
ธ๋ x
๋ก๋ถํฐ ๊ฐ ๋
ธ๋๊น์ง ๊ฑธ๋ฆฌ๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค๊ณ ํด๋ณด์. ์ ์์ฐ์ด๋ ๋ฐฉ์์ด๊ธด ํ์ง๋ง(๊ตฌํ์ด dfs๋ณด๋ค ๋ณต์กํด์) ์๋์ฒ๋ผ๋ ๊ฐ๋ฅํ๋ค.
queue<int> q;
bool visited[N];
int distance[N];
void BFS(int x) {
visited[x] = true;
distance[x] = 0;
q.push(x);
while(q.size()) {
int s = q.front(); q.pop();
for (auto u: adj[s]) {
if (visited[u]) continue;
visited[u] = true;
distance[u] = distance[s] + 1;
q.push(u);
}
}
}