๐ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ฐ์ ์๋ฆฌ๋ก ๋์ํ๋ ๋ ๋ค๋ฅธ ์คํจ๋ ํธ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๐ก ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ด๋?
์ฐธ๊ณ : https://withseungryu.tistory.com/70?category=753127
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ํฐ ์ฐจ์ด๋ ์งํ ๋ฐฉ์์ ๋๋ค.
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ๊ธฐ์ ๊ธฐ์ ์ฐ๋ฐ์ ์ผ๋ก ๋ง๋ค์ด์ง ํธ๋ฆฌ์ ์กฐ๊ฐ๋ค์ ํฉ์ณ ์คํผ๋ ํธ๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด๊ณ ,
ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ์ ํ๋์ ์์์ ์ผ๋ก ํธ๋ฆฌ์ ๊ฐ์ ์ ํ๋์ฉ ์ถ๊ฐํ๋ฉฐ ์คํจ๋ ํธ๋ฆฌ๊ฐ ๋ ๋๊น์ง ํค์ฐ๋ ๋ฐฉ์์ ๋๋ค.
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ๊ฐ์ (a,b)๋ ์ด๋ฏธ ํธ๋ฆฌ์ ์ํ ๋ ์ ์ ๋ค์ ์ฐ๊ฒฐํ๊ธฐ ๋๋ฌธ์ ํ ๊ฐ์ ์ด ์๋๋๋ค. (์ฌ์ดํด ๋ฐฉ์ง)
์ด์ฒ๋ผ ์คํจ๋ ํธ๋ฆฌ๋ฅผ ์ฐพ์๋ผ ๋๊น์ง ํ๋ณด ๊ฐ์ ๋ค ์ค ๊ฐ์ค์น๊ฐ ๊ฐ์ฅ ์์ ๊ฐ์ ์ ์ถ๊ฐํ๋ฉฐ ๋ฐ๋ณตํฉ๋๋ค.
๐ ๊ตฌํ
๊ตฌํ ์ ์ค์ํ ํฌ์ธํธ๋ ํ ์ ์ ์ ๋ฟ๋ ๊ฐ์ ์ด ๋ ๊ฐ ์ด์์ผ ๊ฒฝ์ฐ ์ด๋ค์ ํ๋ํ๋ ๊ฒ์ฌํ๋ ๊ณผ์ ์ด
์๊ฐ ๋ญ๋น์์ ๊นจ๋ฌ์์ผ ํฉ๋๋ค!
์ฆ, ํธ๋ฆฌ์ ์ํ์ง ์๋ ์ ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ , ๊ฐ ์ ์ ์ ์ํํ๋ฉด์ ๋ค์์ ์ถ๊ฐํ ์ ์ ์ ์ฐพ์ผ๋ฉฐ,
์ด๋ฅผ ์ํด ํธ๋ฆฌ์ ์ ์ ์ ์ฐ๊ฒฐํ๋ ๊ฐ์ ์ ์ต์ ๊ฐ์ค์น๋ฅผ ์ ์ฅํ๋ minWeight[] ๋ฐฐ์ด์ ํ์ฉ ํ ์ ์์ต๋๋ค.
minWeight[]๋ ํธ๋ฆฌ์ ์ ์ ์ ์๋ก ์ถ๊ฐํ ๋๋ง๋ค ์ด ์ ์ ์ ์ธ์ ํ ๊ฐ์ ๋ค์ ์ํํ๋ฉด์ ๊ฐฑ์ ํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์์ ์ ์ ์ฐพ๋ ์์ O(V)์ด ๊ฑธ๋ฆฌ๋ฉฐ ๋ฐ๋ผ์ ์ ์ฒด ์๊ฐ ๋ณต์ก๋๋ O(V^2 + E)๊ฐ ๋ฉ๋๋ค.
๐ ๊ตฌํ ์ฝ๋
const int MAX_V = 100; //๋ฌธ์ ๋ง๋ค ๋ค๋ฅด๋ค.
const int INF = 987654321;
int V; //์ ์ ์ ๊ฐ์
vector<pair<int, int>> adj[MAX_V]; // ๊ทธ๋ํ์ ์ธ์ ๋ฆฌ์คํธ
int prim(vector<pair<int, int>> selected) {
selected.clear();
vector<bool> added(V, false);//ํด๋น ์ ์ ์ด ํธ๋ฆฌ์ ํฌํจ๋์ด ์๋์ง
vector<int> minWeight(V, INF), parent(V, -1);
int ret = 0;
minWeight[0] = parent[0] = 0; //0๋ฒ ์ ์ ์ ์์์ ์ผ๋ก, ํญ์ ํธ๋ฆฌ์ ๊ฐ์ฅ ๋จผ์ ์ถ๊ฐ
for (int iter = 0; iter < V; ++iter) {
int u = -1;
for (int v = 0; v < V; ++v)
if (!added[v] && (u == -1 || minWeight[u] > minWeight[v]))
u = v;
if (parent[u] != u)
selected.push_back(make_pair(parent[u], u));
ret += minWeight[u];
added[u] = true;
for (int i = 0; i < adj[u].size(); ++i) {
int v = adj[u][i].first, weight = adj[u][i].second;
if (!added[v] && minWeight[v] > weight) {
parent[v] = u;
minWeight[v] = weight;
}
}
}
return ret;
}
๐ก ์๊ฐ ๋ณต์ก๋ : O(|V|^2 + |E|) (ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ๋น ๋ฅด๊ฒ ๋์ํ๋ค.)
๊ถ๊ธํ์ ๊ฒ์ด ์์ผ์๋ฉด ์ธ์ ๋ ์ง ๋๊ธ ๋ฌ์์ฃผ์ธ์!
'Algorithm > Theory' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ (Kruskal Algorithm) (0) | 2020.07.29 |
---|---|
Union-Find, Disjoint Set (์ ๋์จ-ํ์ธ๋, ์ํธ ๋ฐฐํ์ ์งํฉ) (0) | 2020.06.22 |
์ธ๊ทธ๋จผํธ ํธ๋ฆฌ (๊ตฌ๊ฐ ํธ๋ฆฌ, Segment Tree) (0) | 2020.05.25 |
๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ (Bellman-Ford Algorithm) (0) | 2020.05.19 |
[c++] ์ ๋ ฅ์ ์ฌ๋ฌ ๊ฐ์ ํ ์คํธ ์ผ์ด์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. (0) | 2020.02.04 |