struct MinimumCostMaximumFlow { typedef int Flow; typedef int Cost; static const Cost infiniteDistance=1e9; static const Cost EPS=1e-7; static const Flow infiniteFlow=1e9; struct Edge { int u,v; Flow f,c; Cost w; Edge(int u,int v,Flow f,Flow c,Cost w):u(u),v(v),f(f),c(c),w(w){} }; vector e; vector > g; int n,source,sink,*prev; Cost *dist; MinimumCostMaximumFlow(int n):n(n) { dist=(Cost*)malloc(sizeof(Cost)*n); prev=(int*)malloc(sizeof(int)*n); g.resize(n); } ~MinimumCostMaximumFlow() { free(dist); free(prev); g.clear(); } void add(int u,int v,Flow c,Cost w) { g[u].push_back(e.size()); e.push_back(Edge(u,v,0,c,w)); g[v].push_back(e.size()); e.push_back(Edge(v,u,0,0,-w)); } pair minimumCostMaximumFlow(int source,int sink) { this->source=source; this->sink=sink; Flow flow=0; Cost cost=0; while(bellmanFord()) { int u=sink; Flow pushed=infiniteFlow; Cost pushCost=0; while(u!=source) { int id=prev[u]; pushed=min(pushed,e[id].c-e[id].f); pushCost+=e[id].w; u=e[id].u; } u=sink; while(u!=source) { int id=prev[u]; e[id].f+=pushed; e[id^1].f-=pushed; u=e[id].u; } flow+=pushed; cost+=pushCost*pushed; } return make_pair(cost,flow); } bool bellmanFord() { for(int i=0;idist[u]+w+EPS) { dist[v]=dist[u]+w; prev[v]=id; update=true; } } if(!update) break; } return dist[sink]+EPS