洛谷P4013数字梯形问题——网络流24题
题目:https://www.luogu.org/problemnew/show/P4013
最大费用最大流裸题;
注意:在第二种情况中,底层所有点连向汇点的边容量应该为inf,因为可以有多条路径结束在同一个点。(为这个调了半天...)
代码如下:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
queue<int>q;
int const MAXN=,inf=1e9;
int n,m,head[MAXN],ct=,cnt,incf[MAXN],dis[MAXN],pre[MAXN],nd[MAXN],bh[][],t;
bool vis[MAXN];
struct N{
int hd,to,next,w,v;
N(int h=,int t=,int n=,int w=,int v=):hd(h),to(t),next(n),w(w),v(v) {}
}edge[MAXN<<];
void add(int x,int y,int w,int v)
{
edge[++ct]=N(x,y,head[x],w,v);head[x]=ct;
edge[++ct]=N(y,x,head[y],-w,);head[y]=ct;
}
void clr()
{
ct=;
memset(head,,sizeof head);
}
bool spfa()
{
memset(pre,,sizeof pre);
memset(dis,-,sizeof dis);
// memset(incf,3,sizeof incf);
while(q.size())q.pop();
dis[]=;vis[]=;q.push();incf[]=inf;
while(q.size())
{
int x=q.front();q.pop();
// printf("x=%d\n",x);
// cout<<x<<endl;
vis[x]=;
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(dis[u]<dis[x]+edge[i].w&&edge[i].v)
{
dis[u]=dis[x]+edge[i].w;
pre[u]=i;
incf[u]=min(incf[x],edge[i].v);
if(!vis[u])vis[u]=,q.push(u);
}
}
}
return pre[t];
}
void mcf()
{
long long ans=;
while(spfa())
{
ans+=incf[t]*dis[t];
// cout<<incf[t]<<" "<<dis[t]<<endl;
for(int i=pre[t];i;i=pre[edge[i].hd])
{
edge[i].v-=incf[t];
edge[i^].v+=incf[t];
}
}
printf("%lld\n",ans);
}
void cl1()
{
clr();
for(int i=;i<=n;i++)
add(,bh[][i],,);
for(int i=;i<m;i++)
for(int j=;j<n+i;j++)
{
int x=bh[i][j];
int u1=bh[i+][j],u2=bh[i+][j+];
add(x+cnt,u1,,);
add(x+cnt,u2,,);
add(x,x+cnt,nd[x],);
}
for(int i=;i<n+m;i++)
{
int x=bh[m][i];
add(x,x+cnt,nd[x],);
add(x+cnt,t,,);
}
mcf();
}
void cl2()
{
clr();
for(int i=;i<=n;i++)
add(,bh[][i],,);//!inf
for(int i=;i<m;i++)
for(int j=;j<n+i;j++)
{
int x=bh[i][j];
int u1=bh[i+][j],u2=bh[i+][j+];
add(x+cnt,u1,,);
add(x+cnt,u2,,);
add(x,x+cnt,nd[x],inf);
}
for(int i=;i<n+m;i++)
{
int x=bh[m][i];
add(x,x+cnt,nd[x],inf);
add(x+cnt,t,,inf);//inf!!!
}
mcf();
}
void cl3()
{
clr();
for(int i=;i<=n;i++)
add(,bh[][i],,);//!inf
for(int i=;i<m;i++)
for(int j=;j<n+i;j++)
{
int x=bh[i][j];
int u1=bh[i+][j],u2=bh[i+][j+];
add(x+cnt,u1,,inf);
add(x+cnt,u2,,inf);
add(x,x+cnt,nd[x],inf);
}
for(int i=;i<n+m;i++)
{
int x=bh[m][i];
add(x,x+cnt,nd[x],inf);
add(x+cnt,t,,inf);
}
mcf();
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
for(int j=;j<n+i;j++)
{
int x;
scanf("%d",&x);
nd[++cnt]=x;
bh[i][j]=cnt;
}
t=*cnt+;
cl1();
cl2();
cl3();
return ;
}
洛谷P4013数字梯形问题——网络流24题的更多相关文章
- 洛谷 P4013 数字梯形问题
->题目链接 题解: 网络流. #include<cstdio> #include<iostream> #include<queue> #include< ...
- 洛谷P4013 数字梯形问题(费用流)
传送门 两个感受:码量感人……大佬nb…… 规则一:$m$条路径都不相交,那么每一个点只能经过一次,那么考虑拆点,把每一个点拆成$A_{i,j}$和$B_{i,j}$,然后两点之间连一条容量$1$,费 ...
- 洛谷P4013 数字梯形问题(费用流)
题意 $N$行的矩阵,第一行有$M$个元素,第$i$行有$M + i - 1$个元素 问在三个规则下怎么取使得权值最大 Sol 我只会第一问qwq.. 因为有数量的限制,考虑拆点建图,把每个点拆为$a ...
- 洛谷 P4013 数字梯形问题【最大费用最大流】
第一问:因为每个点只能经过一次,所以拆点限制流量,建(i,i',1,val[i]),然后s向第一行建(s,i,1,0),表示每个点只能出发一次,然后最后一行连向汇点(i',t,1,0),跑最大费用最大 ...
- P4013 数字梯形问题 网络流二十四题
P4013 数字梯形问题 题目描述 给定一个由 nn 行数字组成的数字梯形如下图所示. 梯形的第一行有 m 个数字.从梯形的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形 ...
- P4013 数字梯形问题 网络流
题目描述 给定一个由 nn 行数字组成的数字梯形如下图所示. 梯形的第一行有 mm 个数字.从梯形的顶部的 mm 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径. 分别 ...
- Libre 6010「网络流 24 题」数字梯形 (网络流,最大费用最大流)
Libre 6010「网络流 24 题」数字梯形 (网络流,最大费用最大流) Description 给定一个由n 行数字组成的数字梯形如下图所示.梯形的第一行有m 个数字.从梯形的顶部的m 个数字开 ...
- LOJ #6010. 「网络流 24 题」数字梯形
#6010. 「网络流 24 题」数字梯形 题目描述 给定一个由 n nn 行数字组成的数字梯形如下图所示.梯形的第一行有 m mm 个数字.从梯形的顶部的 m mm 个数字开始,在每个数字处可以 ...
- 网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - CodeVS1904 题目传送门 - 洛谷2764 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ...
随机推荐
- git pull出现fatal: unable to access 'https://github.com/XXX/YYY.git'
用cmd 发现ping不同 github.com Ping不通,这时候,只需要在host文件里做些修改就可以,首先,定位到路径 C:\Windows\System32\drivers\etc 找到ho ...
- 在CentOS 7上构建RAID5、LVM和SAMBAserver(5)——架设SAMBAserver
在CentOS 7上构建RAID5.LVM和SAMBAserver(5)--架设SAMBAserver 6. 架设SAMBAserver 6.1. 预备 本节的任务是配置SAMBA服务,共享/home ...
- .net 反射访问私有变量和私有方法 如何创建C# Closure ? C# 批量生成随机密码,必须包含数字和字母,并用加密算法加密 C#中的foreach和yield 数组为什么可以使用linq查询 C#中的 具名参数 和 可选参数 显示实现接口 异步CTP(Async CTP)为什么那样工作? C#多线程基础,适合新手了解 C#加快Bitmap的访问速度 C#实现对图片文件的压
以下为本次实践代码: using System; using System.Collections.Generic; using System.ComponentModel; using System ...
- mysql创建还原点
set autocommit = 0; insert into t1(name) values ("user1"); savepoint p1; insert into t ...
- Python+Selenium框架unittest执行脚本方法之discover()方法
继续接着介绍,如何利用unittest管理和执行测试用例的问题,这里我们还是利用之前已经有的三条测试用例,如果你跳过了前面文章,请回到框架设计篇的第八篇和第七篇,里面有相关测试类的文件.本文来介绍,如 ...
- android4.4 evaluateJavascript 到android2.X上不能调用的问题
android4.4上想用js注入的话.不能用旧的loadUrl()方法,每次load都会将页面又一次刷新一次. 可是在2.X的系统版本号上,evaluateJavascript 方法会报异常.解决的 ...
- 一段经典的 Java 风格程序 ( 类,包 )
前言 本文给出一段经典的 Java 风格程序,请读者初步体会 Java 和 C++ 程序的不同. 第一步:编写一个类 // 将这个类打包至 testpackage 包中 package testpac ...
- 基于TCP的一对回射客户/服务器程序及其运行过程分析( 下 )
执行分析 1. 打开服务器进程: 2. 执行netstat -a命令观察当前的连接状态: 第1条连接记录说明:绑定了本地主机的任意IP,端口为9877,目前处于监听状态. 3. 打开客户进程: 4. ...
- 目标检测之积分图---integral image 积分图2
前面在图像处理一栏中涉及到boxfilter 的时候,简单介绍过积分图,就是每个像素点是左边和上边的累加和,这样的话可以方便均值和方差,以及直方图统计的相关运算,这里再次结合网络资源重新单独对积分图做 ...
- Android-通过SlidingMenu高仿微信6.2最新版手势滑动返回(二)
转载请标明出处: http://blog.csdn.net/hanhailong726188/article/details/46453627 本文出自:[海龙的博客] 一.概述 在上一篇博文中,博文 ...