Algorithm/Theory

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Prim Algorithm)

๐Ÿ‘‰ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๊ฐ™์€ ์›๋ฆฌ๋กœ ๋™์ž‘ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

 

๐Ÿ’ก ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?

์ฐธ๊ณ  : https://withseungryu.tistory.com/70?category=753127

 

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Kruskal Algorithm)

๐Ÿ‘‰ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ MST(์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ) ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. (๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” Prim ์•Œ๊ณ ๋ฆฌ์ฆ˜) ๐Ÿ’ก MST๋ž€? ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ์„ฑ์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฐ€์žฅ '์ €๋ ดํ•œ' ๊ทธ๋ž˜ํ”„๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ ๏ฟฝ

withseungryu.tistory.com

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํฐ ์ฐจ์ด๋Š” ์ง„ํ–‰ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์—ฌ๊ธฐ์ €๊ธฐ์„œ ์‚ฐ๋ฐœ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ํŠธ๋ฆฌ์˜ ์กฐ๊ฐ๋“ค์„ ํ•ฉ์ณ ์Šคํ”ผ๋‹ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ด๊ณ ,

ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ•˜๋‚˜์˜ ์‹œ์ž‘์ ์œผ๋กœ ํŠธ๋ฆฌ์— ๊ฐ„์„ ์„ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•˜๋ฉฐ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ํ‚ค์šฐ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

 

์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๊ฐ„์„  (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|) (ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.)

 

๊ถ๊ธˆํ•˜์‹  ๊ฒƒ์ด ์žˆ์œผ์‹œ๋ฉด ์–ธ์ œ๋“ ์ง€ ๋Œ“๊ธ€ ๋‹ฌ์•„์ฃผ์„ธ์š”!

 

๋ฐ˜์‘ํ˜•