※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 24542번 문제인 튜터-튜티 관계의 수이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/24542
24542번: 튜터-튜티 관계의 수
첫째 줄에 튜터-튜티 관계를 정하는 경우의 수를 $1\,000\,000\,007$로 나눈 나머지를 출력한다.
www.acmicpc.net
문제에서 주어지는 친분 관계 포레스트를 구성하는 각 컴포넌트마다 적어도 한 명씩에게는 교육자료를 배포해야함을 알 수 있다. 또한, 튜터-튜티 관계를 잘 설정하면 각 컴포넌트마다 한 명에게만 교육자료를 배포해도 충분하다는 것을 관찰할 수 있다.
이 때, 한 컴포넌트에서 교육자료를 받을 한 사람을 정하면 이 컴포넌트의 모두에게 교육자료가 배포되게 할 수 있는 튜터-튜티 관계는 유일하다는 것을 관찰하자. 따라서 친분 관계 포레스트를 구성하는 각 컴포넌트의 노드의 개수를 곱하는 것으로 문제를 해결할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
vector<int> G[200001];
bool visited[200001];
ll bfs(int node) {
ll ret = 0;
queue<int> que;
que.push(node);
visited[node] = 1;
while (!que.empty()) {
int cur = que.front(); que.pop();
for (auto node : G[cur]) {
if (visited[node]) continue;
visited[node] = 1;
que.push(node);
}
ret++;
}
return ret;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, M; cin >> N >> M;
while (M--) {
int u, v; cin >> u >> v;
G[u].emplace_back(v);
G[v].emplace_back(u);
}
ll ans = 1;
for (int i = 1; i <= N; i++) {
if (visited[i]) continue;
ans = (ans * bfs(i)) % 1000000007;
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 14939 // C++] 불 끄기 (0) | 2022.04.23 |
---|---|
[BOJ 24552 // C++] 올바른 괄호 (0) | 2022.04.22 |
[BOJ 24544 // C++] 카카오뷰 큐레이팅 효용성 분석 (0) | 2022.04.20 |
[BOJ 24914 // C++] Split the SSHS (0) | 2022.04.19 |
[BOJ 24913 // C++] 개표 (0) | 2022.04.18 |