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;