题目: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题的更多相关文章

  1. 洛谷 P4013 数字梯形问题

    ->题目链接 题解: 网络流. #include<cstdio> #include<iostream> #include<queue> #include< ...

  2. 洛谷P4013 数字梯形问题(费用流)

    传送门 两个感受:码量感人……大佬nb…… 规则一:$m$条路径都不相交,那么每一个点只能经过一次,那么考虑拆点,把每一个点拆成$A_{i,j}$和$B_{i,j}$,然后两点之间连一条容量$1$,费 ...

  3. 洛谷P4013 数字梯形问题(费用流)

    题意 $N$行的矩阵,第一行有$M$个元素,第$i$行有$M + i - 1$个元素 问在三个规则下怎么取使得权值最大 Sol 我只会第一问qwq.. 因为有数量的限制,考虑拆点建图,把每个点拆为$a ...

  4. 洛谷 P4013 数字梯形问题【最大费用最大流】

    第一问:因为每个点只能经过一次,所以拆点限制流量,建(i,i',1,val[i]),然后s向第一行建(s,i,1,0),表示每个点只能出发一次,然后最后一行连向汇点(i',t,1,0),跑最大费用最大 ...

  5. P4013 数字梯形问题 网络流二十四题

    P4013 数字梯形问题 题目描述 给定一个由 nn 行数字组成的数字梯形如下图所示. 梯形的第一行有 m 个数字.从梯形的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形 ...

  6. P4013 数字梯形问题 网络流

    题目描述 给定一个由 nn 行数字组成的数字梯形如下图所示. 梯形的第一行有 mm 个数字.从梯形的顶部的 mm 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径. 分别 ...

  7. Libre 6010「网络流 24 题」数字梯形 (网络流,最大费用最大流)

    Libre 6010「网络流 24 题」数字梯形 (网络流,最大费用最大流) Description 给定一个由n 行数字组成的数字梯形如下图所示.梯形的第一行有m 个数字.从梯形的顶部的m 个数字开 ...

  8. LOJ #6010. 「网络流 24 题」数字梯形

    #6010. 「网络流 24 题」数字梯形   题目描述 给定一个由 n nn 行数字组成的数字梯形如下图所示.梯形的第一行有 m mm 个数字.从梯形的顶部的 m mm 个数字开始,在每个数字处可以 ...

  9. 网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - CodeVS1904 题目传送门 - 洛谷2764 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ...

随机推荐

  1. Maven引入本地Jar包并打包进War包中

    1.概述 在平时的开发中,有一些Jar包因为种种原因,在Maven的中央仓库中没有收录,所以就要使用本地引入的方式加入进来. 2. 拷贝至项目根目录 项目根目录即pom.xml文件所在的同级目录,可以 ...

  2. Android二维码工具zxing使用

    二维码在我们生活中随处可见.在我眼里简直能够用"泛滥"来形容啦.那怎样在我们Android项目中扫描识别二维码或生成二维码图片呢? 我们通常使用的开源框架是zxing.在githu ...

  3. git 强制覆盖,分支合并

    强制合并 git fetch --all && git reset --hard origin/master && git pull 合并代码 git commit - ...

  4. Linux命令行编辑常见的快捷键(有用, 通用)

    本文讲述了Linux命令行编辑常见的快捷键,希望对您有所帮助. Linux命令行编辑快捷键: history 显示命令历史列表 ↑(Ctrl+p) 显示上一条命令 ↓(Ctrl+n) 显示下一条命令 ...

  5. C语言-回溯例3

    排列问题 1.实现排列A(n,m)对指定的正整数m,n(约定1<m<=n),具体实现排列A(n,m).2. 回溯算法设计设置一维数组a,a(i)(i=1,2,…,m)在1—n中取值.首先从 ...

  6. 设置Ubuntu 16.04 LTS的Unity启动器的位置命令

    将Ubuntu 16.04 LTS的Unity启动器移动到桌面底部命令:gsettings set com.canonical.Unity.Launcher launcher-position Bot ...

  7. SAM4E单片机之旅——6、LED闪烁之按钮控制

    现在试试用按钮控制LED灯……让LED在一个按钮按下时亮起:弹起时灭掉. 主要目的是学习GPIO的输入及中断. 一. 电路 图中的J39-n是几个跳线插座,位置在开发板LCD附近,往下进行前要先确保跳 ...

  8. wcf服务发布时,目录中没有文件生成

    1.删除原有的配置文件

  9. 清除inline-block元素默认间距

    1. font-size:0; 2.letter-spaceing:-0.5em;

  10. 工作室成员 GitHub 地址集中贴(按发布时间先后排序)

    金质行 https://github.com/jinxiaohang/ 金林超 https://github.com/jinlinchao/ 王贤国 https://github.com/ErhuoH ...