[C++] ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(ํฌ๋ฃจ์Šค์นผ)

2020. 11. 27. 12:55ยท๐Ÿ“ Computer Science/โœ Algorithm

์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(Minimum Spanning Tree)

๋ชจ๋“  ์ •์ ์„ ์—ฐ๊ฒฐํ•˜๋Š” ํŠธ๋ฆฌ๋ฅผ ์‹ ์žฅ ํŠธ๋ฆฌ๋ผ๊ณ  ํ•˜๋Š”๋ฐ ๊ฐ€์ค‘์น˜๋ฅผ ๊ฐ–๋Š” ์‹ ์žฅ ํŠธ๋ฆฌ ์ค‘ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ์ด ๊ฐ€์žฅ ์ž‘์€ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค.

 

๋Œ€ํ‘œ์ ์œผ๋กœ ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์œผ๋ฉฐ, ๊ทธ ์™ธ์—๋„ ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์†”๋ฆฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ๋‹ค.

  • ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜: ์ž„์˜์˜ ์ •์ ์„ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์‚ฝ์ž…ํ•œ ํ›„ ์ธ์ ‘ํ•œ ์ •์ ์˜ ๊ฐ„์„  ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์ •์ ์„ ํŠธ๋ฆฌ์— ์‚ฝ์ž…ํ•˜๋ฉฐ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ์†”๋ฆฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜

 

1. ํฌ๋ฃจ์Šค์นผ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Kruskal's algorithm)

1) ๊ธฐ๋ณธ ์›๋ฆฌ

๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ ํ›„ ๊ทธ ๋ชฉ๋ก์„ ์ฐจ๋ก€๋Œ€๋กœ ์ˆœํšŒํ•˜๋ฉฐ ์‚ฌ์ดํด์ด ์ƒ๊ธฐ์ง€ ์•Š๋„๋ก ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ์— ์‚ฝ์ž…ํ•˜๋ฉฐ ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.

 

2) ๋ฌธ์ œ

 

www.acmicpc.net/problem/1197

 

1197๋ฒˆ: ์ตœ์†Œ ์ŠคํŒจ๋‹ ํŠธ๋ฆฌ

์ฒซ์งธ ์ค„์— ์ •์ ์˜ ๊ฐœ์ˆ˜ V(1 ≤ V ≤ 10,000)์™€ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ E(1 ≤ E ≤ 100,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ E๊ฐœ์˜ ์ค„์—๋Š” ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์„ธ ์ •์ˆ˜ A, B, C๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋Š” A๋ฒˆ ์ •์ ๊ณผ B๋ฒˆ ์ •์ ์ด

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> parent;
vector<pair<int, pair<int, int>>> graph;	// {๊ฐ€์ค‘์น˜, {์ •์ A, ์ •์ B}}

int Find(int v)
{
	if (parent[v] != v)
		parent[v] = Find(parent[v]);
	return parent[v];
}

int main()
{
	cin.tie(NULL);
	cout.tie(NULL);
	ios::sync_with_stdio(false);

	int V, E;
	cin >> V >> E;

	parent.resize(V + 1);
	for (int i = 1; i <= V; i++)
		parent[i] = i;

	int A, B, C;
	for (int i = 0; i < E; i++)
	{
		cin >> A >> B >> C;
		graph.push_back({ C, {A,B} });
	}

	sort(graph.begin(), graph.end());	// ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ

	int ans = 0;
	for (int i = 0; i < E; i++)
	{
		int parentA = Find(graph[i].second.first);
		int parentB = Find(graph[i].second.second);
		if (parentA != parentB)	// ์‚ฌ์ดํด ๋ฐฉ์ง€
		{
			parent[parentA] = parentB;
			ans += graph[i].first;
		}
	}
	cout << ans;
}

 

https://www.acmicpc.net/problem/13418

 

13418๋ฒˆ: ํ•™๊ต ํƒ๋ฐฉํ•˜๊ธฐ

์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋Š” ํ‘œ์ค€ ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ž…๋ ฅ์€ 1๊ฐœ์˜ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์ž…๋ ฅ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๊ฑด๋ฌผ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 1,000)๊ณผ ๋„๋กœ์˜ ๊ฐœ์ˆ˜ M(1 ≤ M ≤ N(N-1)/2) ์ด ์ฃผ์–ด์ง„๋‹ค. ์ž…๋ ฅ์˜ ๋‘ ๋ฒˆ

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int n, m;
vector<pair<int, pair<int, int>>> graph; 
vector<int> parent;

int Find(int v)
{
	if (parent[v] != v)
		parent[v] = Find(parent[v]);
	return parent[v];
}

int GetAnswer(bool min)
{
	for (int i = 0; i <= n; i++)
		parent[i] = i;

	if (min)
		sort(graph.begin(), graph.end());
	else
		sort(graph.rbegin(), graph.rend());

	int answer = 0;
	for (int i = 0; i <= m; i++)
	{
		int parentA = Find(graph[i].second.first), parentB = Find(graph[i].second.second);
		if (parentA != parentB)
		{
			parent[parentA] = parentB;
			answer += graph[i].first;
		}
	}

	return answer * answer;
}

int main()
{
	cin >> n >> m;
	for (int i = 0, a, b, c; i <= m; i++)
	{
		cin >> a >> b >> c;
		graph.push_back({ c == 0 ? 1 : 0, {a,b} });
	}

	parent.resize(n + 1);
	cout << GetAnswer(false) - GetAnswer(true);
}
์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Computer Science/โœ Algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [C++] ์Šค์œ„ํ•‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Sweeping Algorithm)
  • [C++] ๊ฐ•ํ•œ ์—ฐ๊ฒฐ ์š”์†Œ(ํƒ€์ž”, ์ฝ”์‚ฌ๋ผ์ฃผ)
  • [C++] ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ(Segment Tree)
  • [C++] ๋น„ํŠธ๋งˆ์Šคํฌ(BitMask)
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[C++] ์ตœ์†Œ ์‹ ์žฅ ํŠธ๋ฆฌ(ํฌ๋ฃจ์Šค์นผ)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”