백준1650 지민이의 테러 Season II 작성일 2021-01-15 | In PS 문제 링크 http://icpc.me/1650 사용 알고리즘 MCMF 시간복잡도 $O(VE)$ 풀이 MCMF에서 유량을 2만큼 흘리면 됩니다. 전체 코드 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859#include <bits/stdc++.h> using namespace std; struct Edge{ int v, c, d, inv; Edge() = default; Edge(int v, int c, int d, int inv) : v(v), c(c), d(d), inv(inv) {} }; int N, M; vector<Edge> G[2020]; void addEdge(int s, int e, int c, int d){ G[s].emplace_back(e, c, d, G[e].size()); G[e].emplace_back(s, 0, -d, int(G[s].size())-1); } int prv[2020], inq[2020], dst[2020], idx[2020]; int go(){ static const int S = 1<<1, T = N<<1|1; memset(inq, 0, sizeof inq); memset(prv, -1, sizeof prv); memset(idx, -1, sizeof idx); memset(dst, 0x3f, sizeof dst); queue<int> q; q.push(S); inq[S] = 1; dst[S] = 0; while(q.size()){ int v = q.front(); q.pop(); inq[v] = 0; for(int _i=0; _i<G[v].size(); _i++){ auto i = G[v][_i]; if(i.c && dst[i.v] > dst[v] + i.d){ dst[i.v] = dst[v] + i.d; prv[i.v] = v; idx[i.v] = _i; if(!inq[i.v]) inq[i.v] = 1, q.push(i.v); } } } assert(dst[T] < 1e9); for(int i=T; i!=S; i=prv[i]){ G[prv[i]][idx[i]].c--; int inv = G[prv[i]][idx[i]].inv; G[i][inv].c++; } return dst[T]; } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> N >> M; for(int i=1; i<=N; i++) addEdge(i<<1, i<<1|1, 1e9, 0); for(int i=1; i<=M; i++){ int s, e, x; cin >> s >> e >> x; addEdge(s<<1|1, e<<1, 1, x); addEdge(e<<1|1, s<<1, 1, x); } int ans = 0; for(int i=0; i<2; i++) ans += go(); cout << ans; }