Graph Basic
ย - 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): ๊ทธ ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜

๊ทธ๋ž˜ํ”„์˜ ํ‘œํ˜„

  1. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ
    • vector<int> adj[N]
    • vector<pii> adj[N]: ๊ฐ€์ค‘ ๊ทธ๋ž˜ํ”„์˜ ๊ฒฝ์šฐ
  2. ์ธ์ ‘ ํ–‰๋ ฌ
    • int adj[N][N]
  3. ๊ฐ„์„  ๋ฆฌ์ŠคํŠธ(Edge List)
    • vector<pii> edges
      • 1๊ณผ ์œ ์‚ฌํ•ด๋ณด์ด์ง€๋งŒ ๋‹ค๋ฅด๋‹ค. Edge๋งŒ ์ €์žฅํ•œ ๊ฒƒ
    • vector<piii> edges: ๊ฐ€์ค‘ ๊ทธ๋ž˜ํ”„์˜ ๊ฒฝ์šฐ

๊ทธ๋ž˜ํ”„์˜ ์ˆœํšŒ

  1. 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);
}
}
  1. 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);
}
}
}