자료구조(data structure)
에드몬드 카프 알고리즘(네트워크 플로우) - C++
진한색
2023. 1. 5. 14:59
1부터 6까지 흘려보낼수 있는 최대 유량 구하기
#include <iostream>
#include <vector>
#include <queue>
#define MAX 100
#define INF 100000000
using namespace std;
int n = 6, result;
int c[MAX][MAX], f[MAX][MAX], d[MAX];
vector<int> a[MAX];
void maxFlow(int start, int end) {
while (1) {
fill(d, d + MAX, -1);
queue<int>q;
q.push(start);
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = 0; i < a[x].size(); i++) {
int y = a[x][i];
// 방문 하지 않은 노드 중 용량이 낮은 경우
if (c[x][y] - f[x][y] > 0 && d[y] == -1) {
q.push(y);
d[y] = x;// 경로를 기억
if (y == end)break;// 도착 지점에 도달
}
}
}
// 모든 경로를 다 찾은 경우
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;
}
}
int main(void) {
a[1].push_back(2);
a[2].push_back(1);
c[1][2] = 12;
a[1].push_back(4);
a[4].push_back(1);
c[1][4] = 11;
a[2].push_back(3);
a[3].push_back(2);
c[2][3] = 6;
a[2].push_back(4);
a[4].push_back(2);
c[2][4] = 3;
a[2].push_back(5);
a[5].push_back(2);
c[2][5] = 5;
a[2].push_back(6);
a[6].push_back(2);
c[2][6] = 9;
a[3].push_back(6);
a[6].push_back(3);
c[3][6] = 8;
a[4].push_back(5);
a[5].push_back(4);
c[4][5] = 9;
a[5].push_back(3);
a[3].push_back(5);
c[5][3] = 3;
a[5].push_back(6);
a[6].push_back(5);
c[5][6] = 4;
maxFlow(1, 6);
printf("%d", result);
}
참고:https://blog.naver.com/PostView.naver?blogId=ndb796&logNo=221237111220&redirect=Dlog&widgetTypeCall=true&directAccess=false
728x90