네트워크 플로우를 이해 공부 한 뒤 풀면 쉽게 풀 수 있는 문제다.
#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 |