๐ ๋งํฌ
https://www.acmicpc.net/problem/17222
๐คฏ ํ์ค ํ๊ธฐ
์์คํค๋ ๋ฆฝ๋ฐค ๋ฐ๋ฅด๋ฏ์ด ๋จน๋๊ฑฐ์
๐คท ๋ฌธ์
๐ฉ๐ป ํ์ด
์ต๋ ์ ๋ ๋ฌธ์ ์ด๋ค.
๋ช ์ง -> ๋ช ์ง ์น๊ตฌ๋ค -> ์ฃผ์ ์น๊ตฌ๋ค -> ์ฃผ์
์ด ๋ฐฉํฅ์ ์ต๋ ์ ๋์ ๊ณ์ฐํด์ฃผ๋ฉด ๋๋ค.
์ฃผ์์ด๋ ์ค๊ฐ์ ์น๊ตฌ๋ค ๊ฐ๊ฐ์ด ๋ง์กฑ๋งํ๋ฉด ์์คํค๋ฅผ ๋ฌดํ๋๋ก ๋ฐ์ ์ ์๊ธฐ ๋๋ฌธ์ d[i][e] (e = end) = INF ๋ก ์ด๊ธฐํํด์ค๋ค.
๋ช ์ง์ด ์น๊ตฌ๋ค์ ๋ฐ์ ์ ์๋ ์์คํค ์ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์ d[s][i] = cnt ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ด์ ์ค๊ฐ ๋ช ์ง ์น๊ตฌ - ์ฃผ์ ์น๊ตฌ๋ ์ฃผ์ ์น๊ตฌ๋ค์ด ๋ฐ์ ์ ์๋ ์์คํค ์์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ด๋ ๊ฒ ๊ฐ ๊ฐ์ ๋ณ ํ๋ฅผ ์ ์๋ ์ฉ๋ (capacity)์ ์ด๊ธฐํ ํด์ค ๋ค ๋ฐ๋ก ์ต๋ ์ ๋์ ๊ตฌํด์ฃผ๋ฉด ๋๋ค!
์๋๋ชฌ๋-์นดํ ์๊ณ ๋ฆฌ์ฆ์ ํตํด ๊ตฌํด์ฃผ์๋ค.
์ต๋ ์ ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๋ค๋ฉด ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋ ๊ธฐ๋ณธ ๋ฌธ์ ์ด๋ค.
๐ป ์ฝ๋
//AC
//BOJ 17222 ์์คํค ๊ฑฐ๋
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <string>
using namespace std;
#define INF 987654321
#define SIZE 220
vector<int> v[SIZE];
int c[SIZE][SIZE];
int f[SIZE][SIZE];
int maxFlow(int s, int e)
{
int total = 0;
while (1)
{
queue<int> q;
vector<int> parent(SIZE, -1);
q.push(s);
while (!q.empty() && parent[s] == -1)
{
int cur = q.front();
q.pop();
for (int next : v[cur])
{
if (c[cur][next] - f[cur][next] > 0 && parent[next] == -1)
{
q.push(next);
parent[next] = cur;
}
}
}
if (parent[e] == -1)
break;
int amount = INF;
for (int i = e; i != s; i = parent[i])
{
amount = min(amount, c[parent[i]][i] - f[parent[i]][i]);
}
for (int i = e; i != s; i = parent[i])
{
f[parent[i]][i] += amount;
}
total += amount;
}
return total;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int N, M;
cin >> N >> M;
int cnt[N + M];
int s = 0, e = N + M + 1;
for (int i = 1; i <= N; i++)
{
cin >> cnt[i];
v[e].push_back(i);
v[i].push_back(e);
c[i][e] = INF;
}
for (int i = N + 1; i <= N + M; i++)
{
cin >> c[s][i];
v[i].push_back(s);
v[s].push_back(i);
cnt[i] = c[s][i];
}
for (int i = N + 1; i <= N + M; i++)
{
int n;
cin >> n;
for (int j = 0; j < n; j++)
{
int node;
cin >> node;
v[i].push_back(node);
v[node].push_back(i);
c[i][node] = cnt[node];
}
}
int total = maxFlow(s, e);
cout << total;
return 0;
}
'DEV > PS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ/20665] ๋ ์์ค ๊ฑฐ๋ฆฌ๋๊ธฐ, c++ (2) | 2021.08.20 |
---|---|
[BOJ/11280] 2-SAT - 3, c++ (2) | 2021.08.19 |
[BOJ/13904] ๊ณผ์ , c++ (0) | 2021.08.10 |
[BOJ/22352] ํญ์ฒด์ธ์, c++ (0) | 2021.08.05 |
[BOJ/16118] ๋ฌ๋น ์ฌ์ฐ, c++ (0) | 2021.07.25 |