본문 바로가기
IT/BOJ

백준(BOJ) 6086 최대 유량 ***

by 빨강자몽 2018. 6. 1.

네트워크 플로우를 이해 공부 한 뒤 풀면 쉽게 풀 수 있는 문제다.


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <math.h>
#include <queue>
#include <set>
#include <list>
#include <utility>
#include <functional>
#define MAX 105
#define INF 987654321
#define MOD 1000000
typedef long long ll;
#pragma warning(disable:4996)
using namespace std;

int n,c,total=0,flow[2][MAX][MAX];
char a,b;
vector<int> v[MAX];
queue<int> q;
bool visit[MAX][MAX];

int f(char ch)
{return ch-'A';}

int main()
{
    int st=f('A'),dest=f('Z');
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf(" %c %c %d",&a,&b,&c);
        int q =f(a),w=f(b);
        flow[1][q][w]+=c;
        flow[1][w][q]+=c;
        v[f(a)].push_back(f(b));
        v[f(b)].push_back(f(a));
    }
    while(1)
    {
        int prev[MAX];
        fill_n(&prev[0],MAX,-1);
        q.push(st);
        while(!q.empty())
        {
            int cur=q.front();
            q.pop();
            for(int k=0;k<v[cur].size();k++)
            {
                int cap=cur<v[cur][k]?flow[1][cur][v[cur][k]]:flow[1][v[cur][k]][cur];
                if(prev[v[cur][k]]==-1&&cap-flow[0][cur][v[cur][k0)
                {
                    prev[v[cur][k]]=cur;
                    q.push(v[cur][k]);
                    if(v[cur][k]==dest)
                        break;
                }
            }
        }
        if(prev[dest]==-1)
            break;
        int tmp=dest,mi=INF;
        while(tmp!=st)
        {
            int cap=prev[tmp]<tmp?flow[1][prev[tmp]][tmp]:flow[1][tmp][prev[tmp]];
            mi= min(mi,cap-flow[0][prev[tmp]][tmp]);
            tmp=prev[tmp];
        }
        tmp=dest;
        while(tmp!=st)
        {
            flow[0][prev[tmp]][tmp]+=mi;
            tmp=prev[tmp];
        }
        total+=mi;
    }
    printf("%d\n",total);
    return 0;
}


'IT > BOJ' 카테고리의 다른 글

백준(BOJ) 3048 개미 *  (0) 2018.06.01
백준(BOJ) 2188 축사 배정 ***  (0) 2018.06.01
백준(BOJ) 5676 음주코딩 **  (0) 2018.06.01
백준(BOJ) 11505 구간 곱 구하기 *  (0) 2018.06.01
백준(BOJ) 2336 굉장한 학생 ***  (0) 2018.06.01