[백준] 14621번 나만 안되는 연애(c++)
[백준] 14621번 나만 안되는 연애(c++)
문제 및 입출력
문제 접근
MST(최소 신장 트리)를 이용해서 문제를 풀었다.
문제를 구현할 때는 KRUSKAL 알고리즘을 사용해서 풀었다.
priority_queue를 간선에 넣어서, 간선들을 하나씩 빼고 성별이 같은 대학교 인지 체크를 하고, 만약 같은 성별 대학교라면, 패스를 해주고, 해당 간선을 추가하면 cycle여부를 체크하고 cycle이 생긴다면 패스해주었다.
cycle를 체크할 때는 union-find를 사용하여 구현했다.
코드 구현(c++)
#include <iostream>
#include <queue>
#define MAX 1001
using namespace std;
int parent[MAX];
bool college[MAX]; // 남자 true, 여자 false
int N, M;
int cnt = 0;
int res = 0;
priority_queue<pair<int, pair<int,int> >, vector<pair<int, pair<int, int> > >, greater<pair<int, pair<int,int> > > >pq;
int Find(int n){
if(parent[n] == n) return n;
else return Find(parent[n]);
}
void Union(int x, int y){
x = Find(x);
y = Find(y);
parent[y] = x;
}
void init(){
for(int i = 1 ; i <= N ; i++){
parent[i] = i;
}
}
int bfs(){
// 먼저 priority_queue에서 하나를 꺼내서 간선과 연결되어있는 노드가 다른 성별인지 체크
// 다른 성별이라면, parent가 같은지 체크
while(!pq.empty()){
int num = pq.top().first; int n1 = pq.top().second.first; int n2 = pq.top().second.second;
pq.pop();
if(college[n1] == college[n2]) continue;
if(Find(n1) == Find(n2)) continue;
if(cnt == N - 1) return res;
//연결하기
Union(n1,n2);
res += num;
cnt++;
}
if(cnt == N - 1) return res;
return -1;
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin >> N >> M;
init();
char s;
for(int i = 0 ; i < N ; i++){
cin >> s;
if(s == 'M') college[i+1] = true;
else college[i+1] = false;
}
int n1, n2, num;
for(int i = 0 ; i < M ; i++){
cin >> n1 >> n2 >> num;
pq.push(make_pair(num, make_pair(n1, n2)));
}
cout << bfs() << "\n";
}
Author And Source
이 문제에 관하여([백준] 14621번 나만 안되는 연애(c++)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kpg0518/백준-14621번-나만-안되는-연애c저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)