#include #include #include #include #define MAX 123456789 int sq(int k) { return k*k; } struct MCMF{ // vertex size : 402 struct Edge{ int first; int second; int capacity; int cost; }; std::vector V[1010][1010]; //V[i][j][k] = k'th edge of i->v std::vector E; void setEdge(int first, int second, int capacity, int cost) { int n = E.size(); E.push_back({first,second,capacity,cost}); E.push_back({second,first,0,-cost}); V[first][second].push_back(n); V[second][first].push_back(n+1); } int vSize = 402; int source,sink; int dist[1010],check[1010],prev[1010]; std::vector SPFA() { for(int i=0;i<=vSize;i++) check[i] = 0; for(int i=0;i<=vSize;i++) dist[i] = MAX; std::queue Q; Q.push(source); dist[source] = 0; while(!Q.empty()) { int v = Q.front(); Q.pop(); check[v] = 0; for(int i=0;i<=vSize;i++) { for(int k=0;k0) { if(dist[i]>dist[v]+E[e].cost) { dist[i] = dist[v] + E[e].cost; prev[i] = e; if(check[i]==0) { check[i] = 1; Q.push(i); } } } } } } std::vector path; if(dist[sink]==MAX) return path; else { int v = sink; while(v!=source) { path.push_back(prev[v]); v = E[prev[v]].first; } return path; } } std::pair getMCMF() // { int flow = 0, cost = 0; while(1) { std::vector path = SPFA(); if(path.size()==0) return std::make_pair(flow,cost); else { int f = MAX, c = 0; for(int i=0;i