문제링크
https://www.acmicpc.net/problem/3295
3295번: 단방향 링크 네트워크
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 상호 네트워크를 이루는 노드의 수 n과 단방향 링크의 수 m이 주어진다. (n ≤ 1,000, m ≤ 50,000) 노드는 0번부터 n-1
www.acmicpc.net
풀이
- 구조의 가치는 구조를 이루는 간선의 수이다.
- 링 또는 선형으로만 구성되어있다는 것은 한 정점에서 나가는 간선, 들어오는 간선은 최대 1개씩 있을 수 있다는 뜻
- 간선의 시작점, 도착점 두 그룹으로 이분매칭
코드
- 시간복잡도: $O(VE) = O(NM)$
#include <bits/stdc++.h>
using namespace std;
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int TC; cin >> TC;
while (TC--) {
int N, M;
cin >> N >> M;
vector<vector<int> > adj(N);
vector<int> B(N, -1);
for (int i = 0; i < M; ++i) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
}
vector<int> visited(N, 0);
function<bool(int)> f = [&](int a) {
visited[a] = true;
for (auto b: adj[a]) {
if (B[b] == -1 || (!visited[B[b]] && f(B[b]))) {
B[b] = a;
return true;
}
}
return false;
};
long long ans = 0;
for (int i = 0; i < N; ++i) {
fill(all(visited), false);
ans += f(i);
}
cout << ans << '\n';
}
}
728x90
'PS > BOJ' 카테고리의 다른 글
백준 13546번: 수열과 쿼리 4 (0) | 2022.03.08 |
---|---|
백준 6171번: 땅따먹기 (0) | 2022.03.08 |
백준 1605번: 반복 부분문자열 (0) | 2022.03.07 |
백준 11479번: 서로 다른 부분 문자열의 개수 2 (0) | 2022.03.07 |
백준 3640번: 제독 (0) | 2022.03.07 |