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;
}