首页 > 其他分享 >网络流模板-最小费用最大流

网络流模板-最小费用最大流

时间:2023-05-28 21:12:15浏览次数:34  
标签:费用 head int 最小 vis edges todo 模板 dis

最小费用最大流:

struct flow { // }{{{
using ll = long long;
constexpr static int V = 5e3, E = 5e4;
constexpr static int EDGE_NIL = -1;
constexpr static ll INF = 0x3f3f3f3f3f3f3f3f;
struct Edge {
	int to, nxt, cost, lf;
} edges[E * 2];
struct mypair{
	ll dis; int id;
	bool operator<(const mypair& a) const{return dis > a.dis;}
	mypair(ll d, int x){dis = d, id = x;}
};
ll dis[V], h[V];
int head[V], back[V];
sd bitset<V> vis;
int is, it, iv, cnt;
int maxf, minc;
void init(int v, int s, int t) {
	is = s, iv = v, it = t;
	cnt = 0;
	maxf = minc = 0;
	memset(head, 0xff, sizeof head);
}
void addflow(int s, int t, int f, int c) {
	edges[cnt] = (Edge) {.to = t, .nxt = head[s], .cost = c, .lf = f}, head[s] = cnt++;
	edges[cnt] = (Edge) {.to = s, .nxt = head[t], .cost = -c, .lf = 0}, head[t] = cnt++;
}
bool dijk() {
	sd priority_queue<mypair> todo;
	memset(dis, 0x3f, sizeof dis);
	vis.reset();
	dis[is] = 0;
	back[is] = EDGE_NIL;
	todo.push({0, is});
	while (!todo.empty()) {
		int s = todo.top().id;
		todo.pop();
		if(vis[s]) continue;
		vis[s] = true;
		for (int i = head[s]; i != EDGE_NIL; i = edges[i].nxt) {
			int t = edges[i].to;
			ll w = (ll)edges[i].cost + h[s] - h[t];
			if (edges[i].lf && dis[t] > dis[s] + w) {
				dis[t] = dis[s] + w;
				back[t] = i ^ 1;
				if(!vis[t]) todo.push({dis[t], t});
			}
		}
	}
	return dis[it] != INF;
}
void spfa(){
	sd queue<int> todo;
	vis.reset();
	memset(h, 0x3f, sizeof h);
	h[is] = 0;
	todo.push(is);
	while(!todo.empty()){
		int s = todo.front();
		todo.pop();
		vis[s] = false;
		for(int i=head[s]; i!=EDGE_NIL; i=edges[i].nxt){
			int t = edges[i].to;
			if(edges[i].lf && h[t] > h[s] + edges[i].cost){
				h[t] = h[s] + edges[i].cost;
				if(!vis[t]) vis[t] = 1, todo.push(t);
			}
		}
	}
}
void mcmf() {
	spfa();
	while (dijk()) {
		int df = 0x3f3f3f3f;
		UP(i, 0, iv) h[i] += dis[i];
		for (int i = back[it]; i != EDGE_NIL; i = back[edges[i].to]) {
			df = sd min(df, edges[i ^ 1].lf);
		}
		for (int i = back[it]; i != EDGE_NIL; i = back[edges[i].to]) {
			edges[i].lf += df;
			edges[i ^ 1].lf -= df;
		}
		maxf += df;
		minc += df * h[it];
	}
}
}; // {}}}

标签:费用,head,int,最小,vis,edges,todo,模板,dis
From: https://www.cnblogs.com/x383494/p/17438847.html

相关文章

  • 有序矩阵中的第 k 个最小数组和
    1.暴力记录前k个classSolution{public:intkthSmallest(vector<vector<int>>&mat,intk){vector<int>pre(k,0);//存储前k个最小的和intcur[mat[0].size()*k];//存储intsize=1;//用于记录pre当前大小for(auto&r......
  • m基于MATLAB的发票数字信息识别算法仿真,通过形态学处理进行字符分割,通过模板匹配实
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要形态学是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为本质的形状特征,如边界和连通区域等。同时像细化、像素化和修剪毛刺等......
  • CS61b_最小区间排序
       publicstaticvoidzorkSort(int[]A,intk){inti;intn=A.length;i=0;PriorityQueue<Integer>pq=newPriorityQueue<>();while(i<k){pq.add(A[i]);i++;}whil......
  • c++模板的引用类型参数折叠问题解释
    template<typenameT>voidf1(T&);实参可以是左值、const类型的左值,不能是右值。f1(i);  //正确,i是int型,T是intf1(c); //正确,i是constint型,T是constintf1(5); //错误 template<typenameT>voidf1(constT&);实参可以是左值、const类型的左值、......
  • java实现导入word模板导入试题
    ​ 最近有一个项目需要将一个word文档中的试题数据导入,并存储到数据库中。试题类型包括:单选题、多选题、判断题、填空题、简答题。支持图片导入(我的这篇是借鉴JAVA实现Excel、Word模板导入-JAVA-华仔部落,javapoi解析上传word试卷(题库管理系统)-爱码网)这两位大神的。废话......
  • 最小生成树学习笔记
    什么是最小生成树一个图中可能存在多条相连的边,我们从一个图中挑出一些边生成一棵树(树就是指一个无向连通图不包含回路(连通图中不存在环))。这仅仅是生成一棵树,还未满足最小,当图中每条边都存在权重时,这时候我们从图中生成一棵树(n-1条边)时,生成这棵树的总代价就是每条边......
  • Freemarker模板语法大全
    FreeMarker的插值有如下两种类型:1,通用插值${expr};2,数字格式化插值:#{expr}或#{expr;format}${book.name?if_exists}//用于判断如果存在,就输出这个值${book.name?default(‘xxx’)}//默认值xxx${book.name!"xxx"}//默认值xxx${book.date?string('yyyy-MM-dd')}//......
  • 软件测试职业生涯需要编写的全套文档模板,收藏这一篇就够了(附文档模板及视频)~
    作为一名测试工程师,在整个的职业生涯中,会涉及到各种不同类型的文档编写,大体包括如下:对应文档模板及文档编写视频如下:  一、测试岗位必备的文档在一个常规的软件测试流程中,会涉及到测试计划、测试方案、测试用例、测试报告的编写,这些文档也是软件测试岗位必须掌握的文档类......
  • 高精度模板
    xiayicheng的高精模板,可自取介绍各变量作用变量名作用\(len\)存储数字长度\(symbol\)存储数字符号,\(1\)为负,\(0\)为正\(s\)倒序存储数字功能\(^*\)变量赋值:\(\texttt{int,char,Bigint}\)比较大小:\(\texttt{Bigint}\)加减法:\(\texttt{Bigint}\)......
  • 所有背包问题模板
    01背包问题:无优化for(inti=1;i<=n;i++){for(intc=0;c<=m;c++){f[i][c]=f[i-1][c];if(c>=w[i])f[i][c]=max(f[i][c],f[i-1][c-w[i]]+v[i]);}}一维数组优化:for(inti=1;i<=n;i++){for(intc=m;c>=0;c--){......