struct MCFC { struct edge { int to,next; ll cap,flow,cost; } e[maxm]; int N; int head[maxn],tot,pre[maxn]; ll dis[maxn]; bool vis[maxn]; void init(int n) { N=n; tot=1; for(int i=0; i<=n; ++i) head[i]=0; } void add(int u,int v,ll cap,ll cost) { tot++; e[tot].to=v; e[tot].cap=cap; e[tot].flow=0; e[tot].cost=cost; e[tot].next=head[u]; head[u]=tot; tot++; e[tot].to=u; e[tot].cap=0; e[tot].flow=0; e[tot].cost=-cost; e[tot].next=head[v]; head[v]=tot; } bool spfa(int s,int t) { queue<int>q; for(int i=0; i<=N; ++i) { dis[i]=inf; vis[i]=0; pre[i]=-1; } dis[s]=0; vis[s]=1; q.push(s); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u]; i; i=e[i].next) { int v=e[i].to; if(e[i].cap>e[i].flow&&dis[v]>dis[u]+e[i].cost) { dis[v]=dis[u]+e[i].cost; pre[v]=i; if(!vis[v]) { vis[v]=1; q.push(v); } } } } if(pre[t]==-1) return false; return true; } ll mcfc(int s,int t) { ll maxflow=0; ll mincost=0; while(spfa(s,t)) { ll minn=inf;//增广流量 ll cost=0;//增广路最小花费 for(int i=pre[t]; i!=-1; i=pre[e[i^1].to]) { if(minn>e[i].cap-e[i].flow) minn=e[i].cap-e[i].flow; } for(int i=pre[t]; i!=-1; i=pre[e[i^1].to]) { e[i].flow+=minn; e[i^1].flow-=minn; cost+=e[i].cost; } mincost+=cost*minn; maxflow+=minn; } return maxflow; } }st;