본문 바로가기

알고리즘/알고리즘 이론, 템플릿

네트워크 플로우

// freopen("input.txt", "r", stdin);
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <string>
#include <cmath>
#include <algorithm>
#include <vector>
#include <utility>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <cstring>
#include <list>
#include <set>
#include <string.h>
#include <map>
#include <limits.h>
#include <stdlib.h>
#include <typeinfo>
#include <bitset>

#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rep1(i, n) for (int i = 1; i <= (int)(n); ++i)
#define range(x) begin(x), end(x)
#define sz(x) (int)(x).size()
#define pb push_back
#define F first
#define S second

using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef vector<int> vi;

const int INF = 987654321;

int c[802][802];
int f[802][802];
int d[802];
int S = 0;
int F = 800;
vector<int> arr[802];
int N, K, D;
int a, b;
int cap;

int maxFlow(int source, int sink)
{
	int ans = 0;

	while (1)
	{
		fill(d, d+802, -1);
		queue<int> q;
		q.push(source);

		while (!q.empty())
		{
			int cur = q.front();
			q.pop();

			for (int i = 0; i < arr[cur].size(); i++)
			{
				int next = arr[cur][i];
				if (c[cur][next] - f[cur][next] > 0 && d[next] == -1)
				{
					d[next] = cur;
					q.push(next);
				}
			}
		}

		if (d[sink] == -1)
			break;

		int flow = INF;
		for (int i = sink; i != source; i = d[i])
		{
			flow = min(flow, c[d[i]][i] - f[d[i]][i]);
		}

		for (int i = sink; i != source; i = d[i])
		{
			f[d[i]][i] += flow;
			f[i][d[i]] -= flow;
		}

		ans += flow;

	}

	return ans;
}

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N >> K >> D;

	for (int i = 1; i <= D; i++)
	{
		cin >> a;

		arr[F].push_back(i + 400);
		arr[i+400].push_back(F);
		c[i+400][F] = a;
	}

	for (int i = 1; i <= N; i++)
	{
		cin >> a;

		c[S][i] = K;
		arr[S].push_back(i);
		arr[i].push_back(S);

		for(int j = 1; j <= a; j++)
		{
			cin >> b;

			c[i][400 + b] = 1;
			arr[i].push_back(400 + b);
			arr[400 + b].push_back(i);
		}
	}

	cout << maxFlow(S, F);

	return 0;
}

'알고리즘 > 알고리즘 이론, 템플릿' 카테고리의 다른 글

2-sat  (0) 2024.05.09
mcmf  (0) 2024.03.07
머지소트트리  (0) 2024.03.03
LCA , sparsetable  (0) 2023.12.11
다익스트라  (0) 2023.10.26