-
사탕 줍는 로봇 - 15892Algorithm/BOJ 2020. 7. 6. 15:53123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101//15892 - 사탕 줍는 로봇#include <iostream>#include <vector>#include <queue>using namespace std;int N, M;typedef struct edge {int dest;int capa;struct edge* rev;edge(int d, int c) : dest(d), capa(c) {}}Edge;vector<vector<Edge*>> adj;int work[301];int level[301];void init() {cin >> N >> M;adj = vector<vector<Edge*>>(N+1);int x, y, c;for(int i = 0; i<M; ++i) {cin >> x >> y >> c;Edge* u = new Edge(y, c);Edge* v = new Edge(x, c);u->rev = v;v->rev = u;adj[x].push_back(u);adj[y].push_back(v);}}bool bfs() {fill(level, level+N+1, -1);queue<int> Q;Q.push(1);level[1] = 0;while(!Q.empty()) {int here = Q.front();Q.pop();for(int i = 0; i<adj[here].size(); ++i) {Edge* e = adj[here][i];int there = e->dest;int cap = e->capa;if(level[there] == -1 && cap > 0) {level[there] = level[here]+1;Q.push(there);}}}return level[N] != -1;}int dfs(int here, int fl) {if(here == N) return fl;for(int& i = work[here]; i<adj[here].size(); i++) {Edge* e = adj[here][i];Edge* re = e->rev;int there = e->dest;int cap = e->capa;if(level[there] == level[here] + 1 && cap > 0) {int df = dfs(there, min(fl, cap));if(df > 0) {e->capa -= df;re->capa += df;return df;}}}return 0;}int main() {ios_base::sync_with_stdio(0);cin.tie(0);init();int ans = 0;while(bfs()) {fill(work, work+N+1, 0);while(1) {int df = dfs(1, 11111);if(!df) break;ans += df;}}cout << ans;}
cs 정보 - Color Scripter
Simple & Flexible Syntax HighLighter
colorscripter.com
사탕 줍는 로봇
최대 유량을 구하는 문제입니다. 디닉알고리즘을 사용해서 해결했습니다!
'Algorithm > BOJ' 카테고리의 다른 글
369 - 17614 (0) 2020.07.19 비트베리 - 17374 (0) 2020.07.13 세 용액 - 2473 (0) 2020.04.16 소가 길을 건너간 이유 6 - 14466 (0) 2020.04.01 네트워크 연결 - 3780 (0) 2020.04.01