문제링크
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 |