์ต์ ์ ์ฅ ํธ๋ฆฌ(Minimum Spanning Tree)
๋ชจ๋ ์ ์ ์ ์ฐ๊ฒฐํ๋ ํธ๋ฆฌ๋ฅผ ์ ์ฅ ํธ๋ฆฌ๋ผ๊ณ ํ๋๋ฐ ๊ฐ์ค์น๋ฅผ ๊ฐ๋ ์ ์ฅ ํธ๋ฆฌ ์ค ๊ฐ์ค์น์ ํฉ์ด ๊ฐ์ฅ ์์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ผ๊ณ ํ๋ค.
๋ํ์ ์ผ๋ก ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ์ด ์์ผ๋ฉฐ, ๊ทธ ์ธ์๋ ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ฆฐ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ค.
- ํ๋ฆผ ์๊ณ ๋ฆฌ์ฆ: ์์์ ์ ์ ์ ๋ฃจํธ ๋ ธ๋๋ก ์ฝ์ ํ ํ ์ธ์ ํ ์ ์ ์ ๊ฐ์ ์ค ๊ฐ์ฅ ์์ ์ ์ ์ ํธ๋ฆฌ์ ์ฝ์ ํ๋ฉฐ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
- ์๋ฆฐ ์๊ณ ๋ฆฌ์ฆ
1. ํฌ๋ฃจ์ค์นผ ์๊ณ ๋ฆฌ์ฆ(Kruskal's algorithm)
1) ๊ธฐ๋ณธ ์๋ฆฌ
๋ชจ๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ ํ ๊ทธ ๋ชฉ๋ก์ ์ฐจ๋ก๋๋ก ์ํํ๋ฉฐ ์ฌ์ดํด์ด ์๊ธฐ์ง ์๋๋ก ์ต์ ์ ์ฅ ํธ๋ฆฌ์ ์ฝ์ ํ๋ฉฐ ์ต์ ์ ์ฅ ํธ๋ฆฌ๋ฅผ ๋ง๋ ๋ค.
2) ๋ฌธ์
#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
#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);
}