Algorithm π§π»π»/λ°±μ€(BOJ)
[λ°±μ€,c++] 14621λ² - λλ§ μλλ μ°μ
dkswnkk
2021. 11. 11. 23:17
λ¬Έμ
14621λ²: λλ§ μλλ μ°μ
μ λ ₯μ 첫째 μ€μ νκ΅μ μ Nμ νκ΅λ₯Ό μ°κ²°νλ λλ‘μ κ°μ Mμ΄ μ£Όμ΄μ§λ€. (2 ≤ N ≤ 1,000) (1 ≤ M ≤ 10,000) λμ§Έ μ€μ κ° νκ΅κ° λ¨μ΄ λνκ΅λΌλ©΄ M, μ¬μ΄ λνκ΅λΌλ©΄ Wμ΄ μ£Όμ΄μ§λ€. λ€μ Mκ°μ
www.acmicpc.net
μ½λ
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, M; //N=νκ΅μ μ(λ
Έλ) M=λλ‘μ μ(κ°μ )
int parent[1001];
char gender[1001];
int ans = 0;
bool flag[1001];
vector<pair<int, pair<int, int>>> edges;
int findParent(int x) {
if (x == parent[x]) return x;
else return x = findParent(parent[x]);
}
void unionParent(int a, int b) {
a = findParent(a);
b = findParent(b);
if (a < b) parent[b] = a;
else parent[a] = b;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> N >> M;
for (int i = 1; i <= N; i++) { //λΆλͺ¨ν
μ΄λΈ μμμ λΆλͺ¨λ₯Ό μκΈ°μμ μΌλ‘ μ΄κΈ°ν λ° μ±λ³μ 보 μ
λ ₯
char sex; cin >> sex;
parent[i] = i;
gender[i] = sex;
}
for (int i = 0; i < M; i++) {
int u, v, d; cin >> u >> v >> d;
edges.push_back({ d,{u,v} }); //거리λ₯Ό κΈ°μ€μΌλ‘ μ λ ¬νκΈ° μν΄ κ±°λ¦¬λ₯Ό ννμ 첫λ²μ§Έ μμλ‘ μ
λ ₯
}
sort(edges.begin(), edges.end());
for (int i = 0; i < edges.size(); i++) {
int cost = edges[i].first;
int a = edges[i].second.first;
int b = edges[i].second.second;
if (gender[a] == gender[b]) continue; //μ±λ³μ΄ κ°μΌλ©΄ 무μ
if (findParent(a) != findParent(b)) {
ans += cost;
unionParent(a, b);
flag[a] = flag[b] = true; //ν΄λΉ λ
Έλλ₯Ό λ°©λ¬ΈνμΌλ TRUEμ²λ¦¬
}
}
for (int i = 1; i <= N; i++) { //νλ²μ΄λΌλ λ°©λ¬Έ νμ§ μμ λ
Έλκ° μλ€λ©΄ μ°κ²°x
if (!flag[i]) {
cout << -1;
return 0;
}
}
cout << ans;
return 0;
}