#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define PB push_back #define ALL(x) (x).begin(),(x).end() #define SZ(x) ((int)(x).size()) #define REP(i, n) for(int i=0; i=0; --i) #define FOR(i, b, e) for(typeof(e) i=b; i!=e; ++i) using namespace std; typedef long long LL; typedef vector VI; typedef vector VVI; typedef vector VS; typedef istringstream ISS; int N; VI x, y, npeng, mjumps; double jdist; const int INF=10000000; VVI adj; int find(int s, int t, VVI &cap) { int N=SZ(cap); VI prevnode(N,-1); vector flow(N, 0); deque q; q.PB(s); flow[s]=INF; while(!q.empty()) { int node=q.front(); q.pop_front(); if(node==t) break; REP(i, SZ(adj[node])) { // REP(i, N) { int next=adj[node][i]; if(flow[next] || cap[node][next]==0) continue; flow[next]=min(flow[node], cap[node][next]); prevnode[next]=node; q.PB(next); } } //if(!visited[t]) return 0; int fl=flow[t]; while(prevnode[t]!=-1) { cap[t][prevnode[t]]+=fl; cap[prevnode[t]][t]-=fl; t=prevnode[t]; } return fl; } int maxflow(int s, int t, VVI cap) { int flow=0; int pathcap=0; do { pathcap=find(s, t, cap); flow+=pathcap; } while(pathcap); return flow; } bool isedge(int i ,int j) { double dx=x[i]-x[j], dy=y[i]-y[j]; return dx*dx+dy*dy