mojo's Blog

[백준 6086] 최대 유량 본문

백준/Graph

[백준 6086] 최대 유량

_mojo_ 2021. 8. 18. 13:29

문제 링크 => 6086번: 최대 유량 (acmicpc.net)

 

6086번: 최대 유량

첫째 줄에 정수 N (1 ≤ N ≤ 700)이 주어진다. 둘째 줄부터 N+1번째 줄까지 파이프의 정보가 주어진다. 첫 번째, 두 번째 위치에 파이프의 이름(알파벳 대문자 또는 소문자)이 주어지고, 세 번째 위

www.acmicpc.net


최대 유량 문제이다.

 

Edmond-carp Algorithm 을 이용하여 해결하였다.

 

문제에서 활용될 노드는 'A' ~ 'Z', 'a' ~ 'z' 이므로 총 52개의 노드가 필요하다.

 

Input 을 보면 from, to, capacity 가 제공되는데 여기서 from, to 가 중복해서 나타나는 경우가 존재한다.

 

따라서 capacity를 노드에서 노드로 이동하는 2차원 배열 c[x][y] 에 대하여 c[from][to] += capacity, c[to][from] += capacity 를 해줘야 한다. (양방향으로 흐르므로 from => to, to=> from 동시에 capacity를 체크해줘야 함)

 

최대유량을 구하기 위한 모든 세팅이 완료되면 start : 'A', end : 'Z' 임을 이용하여 Edmond-carp Algorithm 을 이용하여 구해주면 끝이다.

 

풀이 code

 

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <vector>
#include <stack>
#include <queue>
#include <stdio.h>
#include <iomanip>
#include <map>
#include <cstdlib>

#define INF 100000000

using namespace std;

int N, result;
int c[60][60], f[60][60], d[60];
vector<int> v[60];

void solve(int start, int end) {
	while (1) {
		fill(d, d + 60, -1);
		queue<int> q;
		q.push(start);

		// Execute BFS 
		while (!q.empty()) {
			int x = q.front();
			q.pop();
			for (int y : v[x]) {
				if (c[x][y] - f[x][y] > 0 && d[y] == -1) {
					q.push(y);
					d[y] = x; //경로를 기억시킴
				}
			}
		}

		// 모든 경로를 다 찾은 경우 탈출
		if (d[end] == -1) break;

		int flow = INF;
		for (int i = end; i != start; i = d[i]) {
			flow = min(flow, c[d[i]][i] - f[d[i]][i]);
		}
		for (int i = end; i != start; i = d[i]) {
			f[d[i]][i] += flow;
			f[i][d[i]] -= flow;
		}
		result += flow;
	}

	cout << result << endl;
}

void input() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		char c1, c2;
		int capacity;
		cin >> c1 >> c2 >> capacity;
		int from = c1 - 'A', to = c2 - 'A';

		v[from].push_back(to);
		v[to].push_back(from);
		c[from][to] += capacity;
		c[to][from] += capacity;
	}
}

int main(void) {

	input();
	solve(0, 25);

	return 0;
}

 

'백준 > Graph' 카테고리의 다른 글

[백준 4803] 트리  (0) 2021.08.23
[백준 17412] 도시 왕복하기1  (0) 2021.08.18
[백준 10891] Cactus? Not cactus?  (0) 2021.08.10
[백준 6672] Electricity  (0) 2021.08.10
[백준 11400] 단절선  (0) 2021.08.10
Comments