->题目链接

题解:

网络流。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<queue>
  4. #include<cstring>
  5. #define N 4010
  6. #define inf 1000000000
  7. using namespace std;
  8. int a[N][N],head[N],dis[N],inq[N],fa[N],n,m,num,cnt,S,T;
  9. struct node {
  10. int u,v,pre,f,w;
  11. } e[N];
  12. void add(int u,int v,int f,int w) {
  13. e[++cnt].u=u;e[cnt].v=v;
  14. e[cnt].f=f;e[cnt].w=w;
  15. e[cnt].pre=head[u];head[u]=cnt;
  16. e[++cnt].u=v;e[cnt].v=u;
  17. e[cnt].f=;e[cnt].w=-w;
  18. e[cnt].pre=head[v];head[v]=cnt;
  19. }
  20. bool spfa() {
  21. for(int i=; i<=T; i++) dis[i]=inf;
  22. queue<int> q;
  23. q.push(S);
  24. inq[S]=;
  25. dis[S]=;
  26. while(!q.empty()) {
  27. int u=q.front();
  28. q.pop();
  29. inq[u]=;
  30. for(int i=head[u]; i; i=e[i].pre)
  31. if(e[i].f&&dis[e[i].v]>dis[u]+e[i].w) {
  32. dis[e[i].v]=dis[u]+e[i].w;
  33. fa[e[i].v]=i;
  34. if(!inq[e[i].v]) {
  35. inq[e[i].v]=;
  36. q.push(e[i].v);
  37. }
  38. }
  39. }
  40. return dis[T]!=inf;
  41. }
  42. void mincost() {
  43. int cost=;
  44. while(spfa()) {
  45. int tmp=fa[T],x=inf;
  46. while(tmp) {
  47. int u=e[tmp].u;
  48. x=min(x,e[tmp].f);
  49. tmp=fa[e[tmp].u];
  50. }
  51. tmp=fa[T];
  52. while(tmp) {
  53. e[tmp].f-=x;
  54. e[tmp^].f+=x;
  55. tmp=fa[e[tmp].u];
  56. }
  57. cost+=x*dis[T];
  58. }
  59. printf("%d\n",-cost);
  60. }
  61. int hao(int i,int j) {
  62. return (m*+i-)*(i-)/+j;
  63. }
  64. void build1() {
  65. cnt=;
  66. memset(head,,sizeof(head));
  67. for(int i=; i<=m; i++)
  68. add(S,i,,-a[][i]);
  69. for(int i=; i<n; i++)
  70. for(int j=; j<=m+i-; j++)
  71. add(hao(i,j)+num,hao(i+,j),,-a[i+][j]),add(hao(i,j)+num,hao(i+,j+),,-a[i+][j+]);
  72. for(int i=; i<=m+n-; i++)
  73. add(hao(n,i)+num,T,,);
  74. for(int i=; i<=n; i++)
  75. for(int j=; j<=m+i-; j++)
  76. add(hao(i,j),hao(i,j)+num,,);
  77.  
  78. }
  79. void build2() {
  80. cnt=;
  81. memset(head,,sizeof(head));
  82. for(int i=; i<=m; i++)
  83. add(S,i,,-a[][i]);
  84. for(int i=; i<=n; i++)
  85. for(int j=; j<=m+i-; j++)
  86. add(hao(i,j),hao(i+,j),,-a[i+][j]),add(hao(i,j),hao(i+,j+),,-a[i+][j+]);
  87. for(int i=; i<=m+n-; i++)
  88. add(hao(n,i),T,inf,);
  89. }
  90. void build3() {
  91. cnt=;
  92. memset(head,,sizeof(head));
  93. for(int i=; i<=m; i++)
  94. add(S,i,,-a[][i]);
  95. for(int i=; i<=n; i++)
  96. for(int j=; j<=m+i-; j++)
  97. add(hao(i,j),hao(i+,j),inf,-a[i+][j]),add(hao(i,j),hao(i+,j+),inf,-a[i+][j+]);
  98. for(int i=; i<=m+n-; i++)
  99. add(hao(n,i),T,inf,);
  100. }
  101. int main() {
  102. scanf("%d%d",&m,&n);
  103. num=(m*+n-)*n/;
  104. S=;
  105. T=num*+;
  106. for(int i=; i<=n; i++)
  107. for(int j=; j<=m+i-; j++)
  108. scanf("%d",&a[i][j]);
  109. build1();
  110. mincost();
  111. build2();
  112. mincost();
  113. build3();
  114. mincost();
  115. return ;
  116. }

AC

我走我的独木桥。

洛谷 P4013 数字梯形问题的更多相关文章

  1. 洛谷P4013数字梯形问题——网络流24题

    题目:https://www.luogu.org/problemnew/show/P4013 最大费用最大流裸题: 注意:在第二种情况中,底层所有点连向汇点的边容量应该为inf,因为可以有多条路径结束 ...

  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. 洛谷P1118 数字三角形游戏

    洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直 ...

  6. 洛谷P1553 数字翻转(升级版)

    题目链接 https://www.luogu.org/problemnew/show/P1553 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的 ...

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

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

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

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

  9. P4013 数字梯形问题

    \(\color{#0066ff}{题目描述}\) 给定一个由 \(n\) 行数字组成的数字梯形如下图所示. 梯形的第一行有 \(m\) 个数字.从梯形的顶部的 \(m\) 个数字开始,在每个数字处可 ...

随机推荐

  1. P1145 约瑟夫

    P1145 约瑟夫 题目描述 n个人站成一圈,从某个人开始数数,每次数到m的人就被杀掉,然后下一个人重新开始数,直到最后只剩一个人.现在有一圈人,k个好人站在一起,k个坏人站在一起.从第一个好人开始数 ...

  2. 在Google Drive上建立免费静态站点

    现今建立一个属于自己的站点已经是一件非常普遍和简单的事情了. 你能够选择买空间,买域名.你也能够使用免费空间.免费域名.你能够选择动态的php wordpress,joomla或者是静态的站点(如使用 ...

  3. 基本3D变换之World Transform, View Transform and Projection Transform

    作者:i_dovelemon 来源:CSDN 日期:2014 / 9 / 28 主题:World Transform, View Transform , Projection Transform 引言 ...

  4. js39---组合模式,查找遍历树

    /** *有这样一个需求 *有一个学校有2个班(一班,二班) *每个班级分2个小组(一班一组,一班二组,二班一组,二班二组) *学校计算机教室有限,每一个小组分着来上课. *考试的时候大家一起考 *请 ...

  5. worktools-git 工具的使用总结(3)

    1.标签的使用,增加标签 git tag 1.0 branch_name zhangshuli@zhangshuli-MS-:~/myGit$ git br -av parent e2e09c4 so ...

  6. Flume的Events

    Flume NG传输的数据的基本单位是event,如果是文本文件,通常是一行记录,这也是事务的基本单位.

  7. 关于Webpack详述系列文章 (第三篇)

    1. 类图 1. 模块 Module是webpack中最核心的类,要加载定的一切和依赖都是Module. 它有很多子类 RawModule NormalModule MultiModule Conte ...

  8. 使用Vue脚手架(vue-cli)从零搭建一个vue项目(包含vue项目结构展示)

    注:在搭建项目之前,请先安装一些全局的工具(如:node,vue-cli等) node安装:去node官网(https://nodejs.org/en/)下载并安装node即可,安装node以后就可以 ...

  9. Direct2D 图形计算

    D2D不仅可以绘制,还可以对多个几何图形对象进行空间运算.这功能应该在GIS界比较吃香. 这些计算包括: 合并几何对象,可以设置求交还是求并,CombineWithGeometry 边界,加宽边界,查 ...

  10. win7打不开chm格式文件

           近期在开发的过程中,发现重装的系统Wind7 打不开java帮助文档.搜索了半天才找到. 在这里分享一下. 一.假设不能打开,可这样恢复文件关联: 1.開始执行,输入:regsvr32 ...