#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define MAXN 1000010
using namespace std;
inline void read(int &x)
{
int s=0,w=1;
char c=getchar();
while(!isdigit(c)){if(c=='-')w=-1;c=getchar();}
while(isdigit(c)){s=(s<<3)+(s<<1)+c-'0';c=getchar();}
x=s*w;
}
inline void write(int x)
{
if(x<0)x=-x,putchar('-');
if(x>9)write(x/10);
putchar('0'+x%10);
}
struct edge
{
int to,nxxt,cost,flow;
}e[MAXN];
int head[MAXN],cnt=-1;
inline void add(int x,int y,int f,int c)
{
e[++cnt].to=y;
e[cnt].cost=c;
e[cnt].flow=f;
e[cnt].nxxt=head[x];
head[x]=cnt;
}
int pre[MAXN],last[MAXN],flow[MAXN],maxflow,mincost,cost[MAXN],S,T;
bool vis[MAXN];
int Q[MAXN<<2],front=1,rear=0;
inline bool spfa(int s,int t)
{
memset(cost,0x3f,sizeof(cost));
memset(flow,0x3f,sizeof(flow));
memset(vis,0,sizeof(vis));
front=1,rear=0;
Q[++rear]=s;
vis[s]=true,cost[s]=0,pre[t]=-1;
while(front<=rear)
{
int to=Q[front++];
vis[to]=false;
for(int i=head[to];i!=-1;i=e[i].nxxt)
{
if(e[i].flow>0&&cost[e[i].to]>cost[to]+e[i].cost)
{
cost[e[i].to]=cost[to]+e[i].cost;
pre[e[i].to]=to;
last[e[i].to]=i;
flow[e[i].to]=min(flow[to],e[i].flow);
if(!vis[e[i].to])
Q[++rear]=e[i].to,vis[e[i].to]=true;
}
}
}
return pre[t]^(-1);
}
inline void MCMF()
{
while(spfa(S,T))
{
int now=T;
maxflow+=flow[now],mincost+=cost[now]*flow[now];
while(now^S)
{
e[last[now]].flow-=flow[T];
e[last[now]^1].flow+=flow[T];
now=pre[now];
}
}
}
int n,m;
int main()
{
memset(head,-1,sizeof(head));
read(n),read(m),read(S),read(T);
while(m--)
{
int u,v,w,f;
read(u),read(v),read(w),read(f);
add(u,v,w,f),add(v,u,0,-f);
}
MCMF();
write(maxflow),putchar(' '),write(mincost),putchar(10);
}
最小费用最大流模板
猜你喜欢
转载自blog.csdn.net/assass_cannotin/article/details/79386981
今日推荐
周排行