P3381【模板】最小费用最大流

题目

题目

思路

显然,Dinic不适合解决费用流问题,因为它进行分层式的优化,其实我们去掉这重优化就是EK算法。
接下来,使用EK算法也不能解决费用流,但是我们可以把bfs替换为spfa,使用spfa来判断增广路是否存在,因为EK算法的思路有一个撤销的理念,所以我们可以用spfa求一条单价最小的增广路,然后把增广路加上去(一种贪心),因为可以撤销,所以这就是可撤销贪心的思路。
code:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int n,m,s,t,x,y,tot=2,head[5001],dep[5001],ans2,fy;
bool book[5001];
long long w,ans,in[5001];
long long mn(long long x,long long y)
{
	return (x>y?y:x);
}
struct f{
	int to,net;
	long long w,fy;
} a[100011];
int b[100011];
void add(int x,int y,long long w,long long fy)
{
	a[tot].to=y,a[tot].w=w,a[tot].net=head[x],a[tot].fy=fy,head[x]=tot++;
	return;
}
bool spfa()
{
	memset(dep,0x3f,sizeof(dep));
	memset(book,0,sizeof(book));
	queue<int> u;
	u.push(s);
	book[s]=1,dep[s]=0,in[s]=0x7fffffff;
	while (u.size())
	{
		y=u.front();
		u.pop();
		book[y]=0;
		for (int j=head[y];j;j=a[j].net)
		{
			if (a[j].w!=0&&dep[y]+a[j].fy<dep[a[j].to])
			{
				dep[a[j].to]=dep[y]+a[j].fy;//记录单价和 
				in[a[j].to]=min(in[y],a[j].w);
				b[a[j].to]=j;
				if (!book[a[j].to]) book[a[j].to]=1,u.push(a[j].to);
			}
		}
	}
	return dep[t]!=1061109567;
}
void dfs()
{
	x=t;
	ans+=in[t];
	ans2+=dep[t]*in[t];
	while (x!=s)
	{
		a[b[x]].w-=in[t],a[b[x]^1].w+=in[t],x=a[b[x]^1].to; 
	}//清空增广路 
	return;
}
int main()
{
	scanf("%d%d%d%d",&n,&m,&s,&t);
	for (int i=0;i<m;i++)
	{
		scanf("%d%d%lld%lld",&x,&y,&w,&fy);
		add(x,y,w,fy);
		add(y,x,0,-fy);
	}
	while (spfa())
	{
		dfs();
	}
	cout<<ans2;
	return 0;
}
已标记关键词 清除标记
相关推荐
<p> <b><span style="font-size:14px;"></span><span style="font-size:14px;background-color:#FFE500;">【Java面试宝典】</span></b><br /> <span style="font-size:14px;">1、68讲视频课,500道大厂Java常见面试题+100个Java面试技巧与答题公式+10万字核心知识解析+授课老师1对1面试指导+无限次回放</span><br /> <span style="font-size:14px;">2、这门课程基于胡书敏老师8年Java面试经验,调研近百家互联网公司及面试官的问题打造而成,从筛选简历和面试官角度,给出能帮助候选人能面试成功的面试技巧。</span><br /> <span style="font-size:14px;">3、通过学习这门课程,你能系统掌握Java核心、数据库、Java框架、分布式组件、Java简历准备、面试实战技巧等面试必考知识点。</span><br /> <span style="font-size:14px;">4、知识点+项目经验案例,每一个都能做为面试的作品展现。</span><br /> <span style="font-size:14px;">5、本课程已经在线下的培训课程中经过实际检验,老师每次培训结束后,都能帮助同学们运用面试技巧,成功找到更好的工作。</span><br /> <br /> <span style="font-size:14px;background-color:#FFE500;"><b>【超人气讲师】</b></span><br /> <span style="font-size:14px;">胡书敏 | 10年大厂工作经验,8年Java面试官经验,5年线下Java职业培训经验,5年架构师经验</span><br /> <br /> <span style="font-size:14px;background-color:#FFE500;"><b>【报名须知】</b></span><br /> <span style="font-size:14px;">上课模式是什么?</span><br /> <span style="font-size:14px;">课程采取录播模式,课程永久有效,可无限次观看</span><br /> <span style="font-size:14px;">课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化</span><br /> <br /> <br /> <span style="font-size:14px;background-color:#FFE500;"><strong>如何开始学习?</strong></span><br /> <span style="font-size:14px;">PC端:报名成功后可以直接进入课程学习</span><br /> <span style="font-size:14px;">移动端:<span style="font-family:Helvetica;font-size:14px;background-color:#FFFFFF;">CSDN 学院APP(注意不是CSDN APP哦)</span></span> </p>
©️2020 CSDN 皮肤主题: 点我我会动 设计师:白松林 返回首页