Luogu--3381 【模板】最小费用最大流
题目链接 3381 【模板】最小费用最大流
手写堆版本 dijkstra 400+ms 看来优先队列的常数好大
#include<bits/stdc++.h> using namespace std; #define maxn 100001 #define inf 0x3f3f3f3f #define pii pair<int,int > inline int read() { ; char c=getchar(); ; ; c=getchar();} )+(x<<)+c-';c=getchar();} return flag?-x:x; } struct ac{ int to,va,cos,nex; }eg[maxn*]; struct wa{ int x,y; wa(){} wa(int a,int b){ x=a,y=b; } }aa[maxn*]; int head[maxn],dis[maxn],pre[maxn],flow[maxn],h[maxn]; bool fa[maxn]; ,maxcost=,tot=,len=; void init(){ tot=; memset(eg,,sizeof(eg)); memset(head,-,sizeof(head)); memset(h,,sizeof(h)); memset(pre,,sizeof(pre)); } bool dcmp(wa A,wa B){ ; ; } void add(int v){ )return; ]))swap(aa[v],aa[v/]),add(v/); } void updata(int v){ >len)return; ==len) { ],aa[v]))swap(aa[v],aa[v*]); return; } ])&&dcmp(aa[v],aa[v*+]))return; ],aa[v*+]))swap(aa[v],aa[v*]),updata(v*); +]),updata(v*+); } void add_eg(int u,int to,int va,int cos){ eg[tot].va=va; eg[tot].cos=cos; eg[tot].to=to; eg[tot].nex=head[u]; head[u]=tot++; eg[tot].va=; eg[tot].cos=-cos; eg[tot].to=u; eg[tot].nex=head[to]; head[to]=tot++; } bool dijstra(int s,int t){ memset(dis,inf,sizeof(dis)); dis[s]=; flow[s]=inf; aa[++len]=wa(,s); while(len){ wa x=aa[]; swap(aa[],aa[len--]); updata(); int u=x.y; if(dis[x.y]<x.x) continue; ;j=eg[j].nex){ int v=eg[j].to; int f=eg[j].cos; &&dis[v]>dis[u]+f+h[u]-h[v]){ dis[v]=dis[u]+f+h[u]-h[v]; flow[v]=min(flow[u],eg[j].va); pre[v]=j; aa[++len]=wa(dis[v],v); add(len); } } } ; ; } void work(){ while(dijstra(s,t)){ int z=t; while(z!=s){ int i=pre[z]; eg[i].va-=flow[t]; eg[i^].va+=flow[t]; z=eg[i^].to; } ;j<=n;j++){ h[j]+=dis[j]; } maxflow+=flow[t]; maxcost+=flow[t]*h[t]; } } int main(){ cin>>n>>m>>s>>t; init(); ;j<m;j++){ int x,y,a,b; //scanf("%d%d%d%d",&x,&y,&a,&b); x=read(); y=read();a=read();b=read(); add_eg(x,y,a,b); } work(); printf("%d %d\n",maxflow,maxcost); }
dijkstra 可能因为常数比较大 t了一个点但是 开o2之后可以轻松水过
dijkstra 版本 #include<bits/stdc++.h> using namespace std; #define maxn 100001 #define inf 0x3f3f3f3f #define pii pair<int,int > int head[maxn],dis[maxn],pre[maxn],flow[maxn],h[maxn]; struct ac{ int to,va,cos,nex; }eg[maxn]; ,maxcost=,tot=; void init(){ tot=; memset(eg,,sizeof(eg)); memset(head,-,sizeof(head)); memset(h,,sizeof(h)); memset(pre,,sizeof(pre)); } void add_eg(int u,int to,int va,int cos){ eg[tot].va=va; eg[tot].cos=cos; eg[tot].to=to; eg[tot].nex=head[u]; head[u]=tot++; eg[tot].va=; eg[tot].cos=-cos; eg[tot].to=u; eg[tot].nex=head[to]; head[to]=tot++; } bool dijstra(int s,int t){ memset(dis,inf,sizeof(dis)); memset(fa,,sizeof(fa)); dis[s]=; flow[s]=inf; fa[s]=; priority_queue<pii,vector<pii>,greater<pii> >q; q.push(make_pair(,s)); while(!q.empty()){ pii x=q.top(); q.pop(); int u=x.second; if(dis[x.second]<x.first) continue; ;j=eg[j].nex){ int v=eg[j].to; int f=eg[j].cos; &&dis[v]>dis[u]+f+h[u]-h[v]){ dis[v]=dis[u]+f+h[u]-h[v]; flow[v]=min(flow[u],eg[j].va); pre[v]=j; q.push(make_pair(dis[v],v)); } } } ; ; } void work(){ while(dijstra(s,t)){ int z=t; while(z!=s){ int i=pre[z]; eg[i].va-=flow[t]; eg[i^].va+=flow[t]; z=eg[i^].to; } ;j<=n;j++){ h[j]+=dis[j]; } maxflow+=flow[t]; maxcost+=flow[t]*h[t]; } } int main(){ cin>>n>>m>>s>>t; init(); ;j<m;j++){ int x,y,a,b; scanf("%d%d%d%d",&x,&y,&a,&b); add_eg(x,y,a,b); } work(); cout<<maxflow<<" "<<maxcost<<endl; }
SPFA版本
// luogu-judger-enable-o2 #include<bits/stdc++.h> using namespace std; #define maxn 100001 #define inf 0x3f3f3f3f int head[maxn],dis[maxn],pre[maxn],flow[maxn]; bool fa[maxn]; struct ac{ int to,va,cos,nex; }eg[maxn*]; ,maxcost=,tot=; void init(){ tot=; memset(eg,,sizeof(eg)); memset(head,-,sizeof(head)); } void add_eg(int u,int to,int va,int cos){ eg[tot].va=va; eg[tot].cos=cos; eg[tot].to=to; eg[tot].nex=head[u]; head[u]=tot++; eg[tot].va=; eg[tot].cos=-cos; eg[tot].to=u; eg[tot].nex=head[to]; head[to]=tot++; } bool spfa(int s,int t){ memset(dis,inf,sizeof(dis)); memset(fa,,sizeof(fa)); dis[s]=; flow[s]=inf; fa[s]=; queue<int>q; q.push(s); while(!q.empty()){ int u=q.front(); q.pop(); fa[u]=; ;j=eg[j].nex){ int v=eg[j].to; int f=eg[j].cos; //cout<<u<<" "<<v<<endl; if(eg[j].va&&dis[u]+f<dis[v]){ dis[v]=dis[u]+f; flow[v]=min(flow[u],eg[j].va); pre[v]=j; if(!fa[v]){ fa[v]=; q.push(v); } } } } ; ; } void work(){ while(spfa(s,t)){ int z=t; while(z!=s){ int i=pre[z]; eg[i].va-=flow[t]; eg[i^].va+=flow[t]; z=eg[i^].to; } maxflow+=flow[t]; maxcost+=flow[t]*dis[t]; } } int main(){ cin>>n>>m>>s>>t; init(); ;j<m;j++){ int x,y,a,b; cin>>x>>y>>a>>b; add_eg(x,y,a,b); } work(); cout<<maxflow<<" "<<maxcost<<endl; }
Luogu--3381 【模板】最小费用最大流的更多相关文章
- 洛谷.3381.[模板]最小费用最大流(zkw)
题目链接 Update:我好像刚知道多路增广就是zkw费用流.. //1314ms 2.66MB 本题优化明显 #include <queue> #include <cstdio&g ...
- 【Luogu】P3381最小费用最大流模板(SPFA找增广路)
题目链接 哈 学会最小费用最大流啦 思路是这样. 首先我们有一个贪心策略.如果我们每次找到单位费用和最短的一条增广路,那么显然我们可以把这条路添加到已有的流量里去——不管这条路的流量是多大,反正它能 ...
- 【洛谷 p3381】模板-最小费用最大流(图论)
题目:给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 解法:在Dinic的基础下做spfa算法. 1 #include<cst ...
- P3381 [模板] 最小费用最大流
EK + dijkstra (2246ms) 开氧气(586ms) dijkstra的势 可以处理负权 https://www.luogu.org/blog/28007/solution-p3381 ...
- Luogu P3381 (模板题) 最小费用最大流
<题目链接> 题目大意: 给定一张图,给定条边的容量和单位流量费用,并且给定源点和汇点.问你从源点到汇点的最带流和在流量最大的情况下的最小费用. 解题分析: 最小费用最大流果题. 下面的是 ...
- 费用流+SPFA ||Luogu P3381【模板】最小费用最大流
题面:[模板]最小费用最大流 代码: #include<cstdio> #include<cstring> #include<iostream> #include& ...
- 最小费用最大流 学习笔记&&Luogu P3381 【模板】最小费用最大流
题目描述 给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 题目链接 思路 最大流是没有问题的,关键是同时保证最小费用,因此,就可以把 ...
- luogu 3376 最小费用最大流 模板
类似EK算法,只是将bfs改成spfa,求最小花费. 为什么可以呢,加入1-3-7是一条路,求出一个流量为40,那么40*f[1]+40*f[2]+40*f[3],f[1]是第一条路的单位费用,f[2 ...
- 洛谷P3381 最小费用最大流模板
https://www.luogu.org/problem/P3381 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用 ...
随机推荐
- [转帖]SAP一句话入门:Sales and Distribution
SAP一句话入门:Sales and Distribution http://blog.vsharing.com/MilesForce/A616565.html SD是Sales and Distri ...
- MyBatis源码分析1 参数映射分析
首先我们拿出之前的代码,在如图位置打上断点,开始调试 我们规定了一个mapper接口,而调用了mapper接口的getEmpByIdAndLastName,我们并没有实现这个接口,这是因为Mybati ...
- web service 异常
1.org/apache/commons/discovery/tools/DiscoverSingleton Exception in thread "main" java.lan ...
- include与__autoload与命名空间namespace与PSR4详解
1. include, require, include_once, require_once include和require是PHP中引入源文件最基本的用法,其他例如__autoload, name ...
- LODOP打印控件如何提示用户升级下载安装新版本
Lodop.C-Lodop在不断完善功能和更新中,新版本修复了很多问题,以及增加很多有利的功能,网站如何更新版本,提示用户下载新版本呢?更新版本很简单,只需要三步:1.替换提示安装部分的自己放置的路径 ...
- vue axios 封装(二)
封装二: http.js import axios from 'axios' import storeHelper from './localstorageHelper' // 全局设置 const ...
- How to enable flash on Chromium
sudo apt install chromium-browser pepperflashplugin-nonfree
- Atcoder Beginner Contest 121 D - XOR World(区间异或和)
题目链接:https://atcoder.jp/contests/abc121/tasks/abc121_d 题目很裸(Atcoder好像都比较裸 就给一个区间求异或和 n到1e12 肯定不能O(n) ...
- java 中的包概念
Java 中的包package, 就是电脑中的文件夹.我们平时在工作中,文件太多时,都会新建文件夹进行分类管理,java 中的包也是类似的道理,当我们的类太多时,也需要进行分类管理,这时我们就会把类文 ...
- h5 打开 app
目前只支持在浏览器中打开,如果非浏览器,例如 微信 支付宝 钉钉 第三方 app 中会弹出下载页面 schemeUrl 为 和app 约定url openApp() { /* 小希学生端 aoji ...