一、有时间再完善
const int INF=0x3f3f3f3f;
const int MAXN=66;
struct edge
{
int to,cap,cost,rev;
edge(int x,int y,int z,int w)
{
to=x;cost=y;cap=z;rev=w;
}
};
vector<edge> g[MAXN];
int prei[MAXN],prej[MAXN],dist[MAXN],n2;
void add(int from,int to,int cost,int cap)
{
g[from].push_back(edge(to,cost,cap,g[to].size()));
g[to].push_back(edge(from,-cost,0,g[from].size()-1));
}
int min_cost_flow(int s,int t,int f)
{
int res=0;
while(f>0)
{
for(int i=0;i<=n2;i++)
dist[i]=INF;
dist[s]=0;
bool update=true;
while(update)
{
update=false;
for(int i=0;i<=n2;i++)
{
if(dist[i]==INF)continue;
for(int j=0;j<g[i].size();j++)
{
edge &e=g[i][j];
if(e.cap>0&&dist[e.to]>dist[i]+e.cost)
{
dist[e.to]=dist[i]+e.cost;
prei[e.to]=i;
prej[e.to]=j;
update=true;
}
}
}
}
if(dist[t]==INF)return -1;
int d=f;
for(int i=t;i!=s;i=prei[i])
{
d=min(d,g[prei[i]][prej[i]].cap);
}
f-=d;
res+=d*dist[t];
for(int i=t;i!=s;i=prei[i])
{
edge &e=g[prei[i]][prej[i]];
e.cap-=d;
g[i][e.rev].cap+=d;
}
}
return res;
}