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