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 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用 ...
随机推荐
- Tomcat 目录结构以及基本配置
1 Tomcat 目录层次结构 ① bin:存放启动和关闭tomcat 的脚本文件② conf: 存放配置文件 server.xml:该文件用于配置和server 相关的信息,比如tomcat 启动端 ...
- [官网]Red Hat Enterprise Linux Release Dates
Red Hat Enterprise Linux Release Dates https://access.redhat.com/articles/3078 The tables below list ...
- keras中TimeDistributed的用法
TimeDistributed这个层还是比较难理解的.事实上通过这个层我们可以实现从二维像三维的过渡,甚至通过这个层的包装,我们可以实现图像分类视频分类的转化. 考虑一批32个样本,其中每个样本是一个 ...
- QTP自动化测试-按行取值(win10下输入?问题)-笔记20181119
在win10下运行qtp10 所有输入汉字都会为?,在win7下可以.查询了百度.bingo没有解决问题.当前的解决办法 ,在脚本中使用DataTable取数据值,添加2行记录,一行使用汉字,一行使用 ...
- Bootstrap之信息记录
Bootstrap中文网: http://www.bootcss.com/ 上面有一些资料和范例 实例精选: https://v3.bootcss.com/getting-started/#examp ...
- linode上切换Linux到FreeBSD
PS:不是真正的无缝切换,数据需要自己备份.还原. Linode官方给出了一篇文章:https://www.linode.com/docs/tools-reference/custom-kernels ...
- Codeforces Round #454 Div. 1
B:考虑2*m怎么构造.因为要求相邻的数不能再相邻,容易想到黑白染色之类的东西,考虑染个色然后大概把黑点扔一边白点扔一边.显然m<=3时无解.对m>4,m为偶数时,如1 2 3 4 5 6 ...
- 大佬RQY真的强
今天听了大佬RQY的讲话,做一下总结吧(这里就不吹了,dalao不需要吹) 第一点,基础真的很重要.什么是基础呢?就是你今年学的觉得难到爆啊什么鬼题啊这是我学过的最zz的东西啊怎么会有这种东西啊&am ...
- P2084 进制转换
原题链接 https://www.luogu.org/problemnew/show/P2084 这个题的思路就是先将输入的数字存到字符数组里,然后求出这一串数字中的非0元素的个数total,并记录最 ...
- python里如何获取当前日期前后N天或N月的日期
#!/usr/bin/python#_*_ coding:UTF-8_*_ import timeimport datetimeimport mathimport calendar ''' time. ...