-
[백준] 11406 - 책 구매하기 2알고리즘/백준 2024. 6. 27. 07:56
문제
https://www.acmicpc.net/problem/11406
풀이
Network flow 문제, Network flow는 각 제한들을 어떻게 capacity로 줄 것인지 생각하면서 풀어야 하는듯그냥 많이 풀어보면서 다양한 유형을 접해봐야할듯...그래도 이 문제는 금방 풀었다.
각각의 입력(사려하고 하는 책의 개수, 사람이 서점에서 구매할 수 있는 책의 개수, 서점이 가진 책의 개수)을 다음과 같이 간선에 매핑하고, capacity를 준 뒤 풀면 된다.
코드
#include <iostream> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <cstring> #include <cmath> #include <unordered_map> using namespace std; int N, M; int capacity[401][401]; int flow[401][401]; int networkFlow(int source, int sink) { int result = 0; while (true) { int parent[401]; queue<int> q; memset(parent, -1, sizeof(parent)); q.push(source); parent[source] = source; while (!q.empty() && parent[sink] == -1) { int now = q.front(); q.pop(); for (int i = 0; i <= 400; ++i) { if (capacity[now][i] - flow[now][i] <= 0) continue; if (parent[i] == -1) { parent[i] = now; q.push(i); } } } if (parent[sink] == -1) break; int mv = 1987654321; for (int i = sink; i != source; i = parent[i]) { mv = min(mv, capacity[parent[i]][i] - flow[parent[i]][i]); } for (int i = sink; i != source; i = parent[i]) { flow[parent[i]][i] += mv; flow[i][parent[i]] -= mv; } result += mv; } return result; } int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> N >> M; for (int i = 1; i <= N; ++i) { capacity[0][i] = 987654321; } int cp; for (int i = 1; i <= N; ++i) { cin >> cp; capacity[i][i + 100] = cp; } for (int i = 1; i <= M; ++i) { cin >> cp; capacity[i + 200][400] = cp; } for (int i = 1; i <= M; ++i) { for (int j = 1; j <= N; ++j) { cin >> cp; capacity[j + 100][i + 200] = cp; } } cout << networkFlow(0, 400); return 0; }
'알고리즘 > 백준' 카테고리의 다른 글
강한 연결 요소, Strongly Connected Component (4) 2024.07.07 [백준] 1738번 - 골목길 (2) 2024.07.06 SPFA(Shortest Path Faster Algorithm) (0) 2024.06.23 네트워크 유량(Network flow) (1) 2024.06.16 회전하는 캘리퍼스(Rotating Cailpers) (0) 2024.06.14