#include <iostream>#include <vector>#include <algorithm>#include <queue>using namespace std;/*유량 그래프 기본 설명::유량 그래프란 : 간선에 가중치 대신 유량 개념을 적용한 알고리즘으로써 간선에 용량(capacity)과 유량(flow) 개념이 있다.1. 유량은 최대 용량을 초과할 수 없으며, 각 정점은 자신이 받은 유량만큼만 유량을 흘려보낼 수 있다.2. 모든 유량의 최초 발생은 시작 정점(S)에서만 발생시킬 수 있으며, 모든 유량은 최종적으로 도착 정점(T)로만 흘러들어간다. (용량에 막혀 흐르지 못하는 유량 제외)3. 유량이 흐르면 간선의 반대방향으로 그 유량만큼의 음의 유량이 흐르는 것으로 취급한다. 포드 풀커슨 알고리즘 / 에드몬드 카프 알고리즘포드 풀커슨 알고리즘은 실제 문제 풀이에서 사용하기엔 worst case 해결이 불가능하므로 에카 알고리즘 사용1. 증가 경로 탐색단순 경로이며 모든 간선에 용량이 남은 경로를 증가 간선이라고 함2. 경로 중, 차단 간선 탐색경로상 용량 - 유량의 값이 최소인 간선을 차단 간선이라고 함3. 경로의 모든 간선에 차단 간선의 용량만큼 유량 추가3번 성질을 만족시키기 위해 f(u, v) += flow를 했으면 f(v, u) -= flow도 실행해야함위 1, 2, 3 번 과정을 더 이상의 증가경로가 없을 때 까지 반복함.이 후 도착 정점 T에 모인 유량을 합산*///예제 6086 최대 유량 해결//A 1 -> Z 26//간선과 용량 / 유량은 별도의 배열로 관리하는것이 편리함.inline int CtoN(char c) { if (c >= 97) return c - 70; return c - 64;}int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int m; cin >> m; vector<vector<int>> arr(53); vector<vector<int>> flow(53, vector<int>(53)); vector<vector<int>> capacity(53, vector<int>(53)); for (int i = 1; i <= m; i++) { char s, d; int v; cin >> s >> d >> v; int sn = CtoN(s); int dn = CtoN(d); arr[sn].push_back(dn); arr[dn].push_back(sn);//역방향간선 capacity[sn][dn] += v; capacity[dn][sn] += v; } int tf = 0; while (true) { vector<int> pathlist; vector<int> prevv(53, -1); queue<int> q; const int source = CtoN('A'); const int tank = CtoN('Z'); q.push(source); // source -> tank 인 증가 경로 탐색 while (!q.empty() && prevv[tank] == -1) { auto current = q.front(); q.pop(); for (auto nx : arr[current]) { int c = capacity[current][nx]; int f = flow[current][nx]; if (c > f && prevv[nx] == -1) { q.push(nx); prevv[nx] = current; } } } if (prevv[tank] == -1) break; int mnf = 2147483647; int cv = tank; while (cv != source) { int c = capacity[prevv[cv]][cv]; int f = flow[prevv[cv]][cv]; mnf = min(mnf, c - f); cv = prevv[cv]; } cv = tank; while (cv != source) { flow[prevv[cv]][cv] += mnf; flow[cv][prevv[cv]] -= mnf; cv = prevv[cv]; } tf += mnf; } cout << tf << "\n"; return 0;}