※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 15511번 문제인 League of Overwatch at Moloco (Hard)이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/15511
15511번: League of Overwatch at Moloco (Hard)
Once in a while, Moloco employees partition themselves into two groups, and engage in a best-of-five series of the League of Overwatch. Since some pairs of employees are hardcore gamers and they have played together as a duo in the past, the company decide
www.acmicpc.net
주어지는 각 직원을 노드, 서로 게임을 같이 해본 적 있는 사람의 쌍을 에지로 하는 그래프 G를 생각하자. 이 때, 문제에서 요구하는 두 집합이 존재하기 위해서는 다음과 같은 두 조건을 만족해야 함을 알 수 있다:
1) G는 이분그래프(bipartite graph)이다.
2) N은 2 이상이다. (각 팀에는 최소한 한 명의 인원이 필요하기 때문이다.)
따라서 G가 이분그래프인지를 판단하는 것으로 문제를 해결할 수 있다. 이는 BFS 또는 DFS를 이용해 간단히 판단할 수 있다. 어떤 그래프가 이분그래프일 동치조건 중 "홀수 길이의 사이클이 존재하지 않는다"는 동치명제를 이용하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
using namespace std;
int N, M;
vector<int> G[1000001];
int dist[1000001];
bool chk = 1;
void dfs(int cur) {
for (auto& x : G[cur]) {
if (dist[x]) {
if (((dist[cur] + dist[x]) & 1) == 0) chk = 0;
}
else {
dist[x] = dist[cur] + 1;
dfs(x);
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
if (N == 1) {
cout << "IMPOSSIBLE";
return 0;
}
while (M--) {
int x, y; cin >> x >> y;
G[x].emplace_back(y);
G[y].emplace_back(x);
}
for (int i = 1; i <= N; i++) {
if (dist[i]) continue;
dist[i] = 1;
dfs(i);
}
if (chk) cout << "POSSIBLE";
else cout << "IMPOSSIBLE";
}
'BOJ' 카테고리의 다른 글
[BOJ 25591 // C++] 푸앙이와 종윤이 (0) | 2022.10.12 |
---|---|
[BOJ 15510 // C++] League of Overwatch at Moloco (Easy) (0) | 2022.10.11 |
[BOJ 1222 // C++] 홍준 프로그래밍 (0) | 2022.10.09 |
[BOJ 14410 // C++] Pareto (0) | 2022.10.08 |
[BOJ 14413 // C++] Poklon (1) | 2022.10.07 |