본문 바로가기
이것저것

네트워크 플로우 알고리즘

by 문자메일 2018. 7. 24.

출처 

https://blog.naver.com/ndb796/221237111220

안경잡이 개발자님의 글


#include <iostream>

#include <vector>

#include <queue>

#include <algorithm>


#define MAX 100

#define INF 1000000000


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\n", result);

}

'이것저것' 카테고리의 다른 글

union-find 알고리즘(파이썬 코드)  (0) 2018.08.19
파이썬 기본 문법 정리  (0) 2018.08.19
git 명령어  (0) 2018.05.26
백준 14501 퇴사  (0) 2018.05.08
백준 2294 동전2 소스  (0) 2018.05.06

댓글