14621번: 나만 안되는 연애
입력의 첫째 줄에 학교의 수 N와 학교를 연결하는 도로의 개수 M이 주어진다. (2 ≤ N ≤ 1,000) (1 ≤ M ≤ 10,000) 둘째 줄에 각 학교가 남초 대학교라면 M, 여초 대학교라면 W이 주어진다. 다음 M개의
www.acmicpc.net
최소 스패닝 트리(MST) 에서 남고-여고 조건이 추가된 문제
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cstring>
#include <cstdio>
using namespace std;
typedef pair<int, pair<int, int>> pipii;
int N, M, u, v, d, length = 0;
bool check;
int parent[1001];
char school[1001];
bool link[1001];
vector<pipii> road;
bool compare(pipii a, pipii b){
return a.first < b.first;
}
int find(int u) {
if (u == parent[u]) {
return u;
}
return parent[u] = find(parent[u]);
}
void _union(int u, int v) {
check = false;
u = find(u);
v = find(v);
if (u==v){
return;
}
check = true;
link[u] = link[v] = true;
parent[u] = v;
}
int main(int argc, const char * argv[]) {
cin >> N >> M;
for (int i=1; i<=N; i++){
cin >> school[i];
parent[i] = i;
}
for (int i=0; i<M; i++){
cin >> u >> v >> d;
road.push_back(make_pair(d, make_pair(u, v)));
}
sort(road.begin(), road.end(), compare);
for (int i=0; i<road.size(); i++) {
u = road[i].second.first;
v = road[i].second.second;
d = road[i].first;
if (school[u] != school[v]) {
_union(u, v);
if (check) {
length += d;
}
}
}
for (int i=1; i<=N; i++) {
if (!link[i]){
cout << -1 << "\n";
return 0;
}
}
cout << length << "\n";
return 0;
}
'ALGORITHM > OTHER' 카테고리의 다른 글
[c++] 14425 문자열 집합 - Trie (트라이), set, unordered_set (0) | 2021.01.24 |
---|---|
2231 분해합, 7568 덩치, 1018 체스판 다시칠하기, 1436 영화감독 숌 (0) | 2021.01.10 |
12789 도키도키 간식드리미 (0) | 2021.01.06 |
11585 속타는 저녁 메뉴 (0) | 2020.12.28 |
11582 치킨 TOP N (2) | 2020.12.26 |