您的位置:首页 > 其它

最小费用最大流模板

2016-06-19 21:28 363 查看
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#define inf 2147483647
using namespace std;
struct data
{
int from,to,next,cup,flow,cost;
data(){from=-1,to=-1,next=-1,cup=-1,flow=-1,cost=-1;}
}e[200];
int vis[200],head[200],d[200],p[200],a[200];
int cnt,flow,cost;
int n,m;
void add(int u,int v,int w,int c)
{e[cnt].from=u,e[cnt].to=v,e[cnt].next=head[u],head[u]=cnt,e[cnt].cup=w,e[cnt].flow=0,e[cnt].cost=c,cnt++;}
bool spfa(int s,int t)
{
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++) d[i]=inf;
queue<int>q;
q.push(s);
d[s]=0,vis[s]=1,p[s]=0,a[s]=inf;
while(!q.empty())
{
int now=q.front();
q.pop();
vis[now]=0;
for(int i=head[now];i>=0;i=e[i].next)
{
if(e[i].cup>e[i].flow&&d[e[i].from]<inf&&d[e[i].to]>d[e[i].from]+e[i].cost)
{
d[e[i].to]=d[e[i].from]+e[i].cost;
p[e[i].to]=i;
a[e[i].to]=min(a[e[i].from],e[i].cup-e[i].flow);
if(!vis[e[i].to])
{
q.push(e[i].to);
vis[e[i].to]=1;
}
}
}
}
if(d[t]==inf) return false;
flow+=a[t];
cost+=d[t]*a[t];
int now=t;
while(now!=s)
{
e[p[now]].flow+=a[t];
e[p[now]^1].flow-=a[t];
now=e[p[now]].from;
}
return true;
}
int main()
{
memset(head,-1,sizeof(head));

scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v,w,c;
scanf("%d%d%d%d",&u,&v,&w,&c);
add(u,v,w,c);
add(v,u,0,-c);
}
int s,t;
scanf("%d%d",&s,&t);
while(spfa(s,t));
cout<<flow<<' '<<cost;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: