【题意】

  给定一个由 n 行数字组成的数字梯形如下图所示。 梯形的第一行有 m 个数字。从梯形
的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动, 形成一条从梯形的顶
至底的路径。
规则 1:从梯形的顶至底的 m 条路径互不相交。
规则 2:从梯形的顶至底的 m 条路径仅在数字结点处相交。
规则 3:从梯形的顶至底的 m 条路径允许在数字结点相交或边相交。
2 3
3 4 5
9 10 9 1
1 1 10 1 1
1 1 10 12 1 1

输入文件示例
input.txt
2 5
2 3
3 4 5
9 10 9 1
1 1 10 1 1
1 1 10 12 1 1

输出文件示例
output.txt
66
75
77

【分析】

  1、拆点 点边容量都为1

  2、点容量改为INF

  3、边容量改为INF(实际上就是最短路了。。)

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
#define Maxn 1010
#define INF 0xfffffff struct node
{
int x,y,f,o,c,next;
}tt[Maxn*Maxn],t[Maxn*Maxn];int len;
int first[Maxn]; int mymin(int x,int y) {return x<y?x:y;}
int mymax(int x,int y) {return x>y?x:y;} void ins(int x,int y,int f,int c)
{
t[++len].x=x;t[len].y=y;t[len].f=f;t[len].c=c;
t[len].next=first[x];first[x]=len;t[len].o=len+;
t[++len].x=y;t[len].y=x;t[len].f=;t[len].c=-c;
t[len].next=first[y];first[y]=len;t[len].o=len-;
} int st,ed;
queue<int > q;
int dis[Maxn],pre[Maxn],flow[Maxn];
bool inq[Maxn];
bool bfs()
{
while(!q.empty()) q.pop();
memset(dis,-,sizeof(dis));
memset(inq,,sizeof(inq));
q.push(st);dis[st]=;flow[st]=INF;inq[st]=;
while(!q.empty())
{
int x=q.front();
for(int i=first[x];i;i=t[i].next) if(t[i].f>)
{
int y=t[i].y;
if(dis[y]<dis[x]+t[i].c)
{
dis[y]=dis[x]+t[i].c;
pre[y]=i;
flow[y]=mymin(flow[x],t[i].f);
if(!inq[y])
{
inq[y]=;
q.push(y);
}
}
}
inq[x]=;q.pop();
}
if(dis[ed]==-) return ;
return ;
} void output()
{
for(int i=;i<=len;i+=)
printf("%d->%d %d %d\n",t[i].x,t[i].y,t[i].f,t[i].c);
printf("\n");
} int max_flow()
{
int ans=,sum=;
while(bfs())
{
sum+=dis[ed]*flow[ed];
ans+=flow[ed];
int now=ed;
while(now!=st)
{
t[pre[now]].f-=flow[ed];
t[t[pre[now]].o].f+=flow[ed];
now=t[pre[now]].x;
}
}
return sum;
} int a[][],num[][];
int m,n,cnt; void init()
{
scanf("%d%d",&m,&n);
for(int i=;i<=n;i++)
{
for(int j=;j<=m+i-;j++)
{
num[i][j]=++cnt;
scanf("%d",&a[i][j]);
}
}
len=;
memset(first,,sizeof(first));
st=*cnt+;ed=st+;
for(int i=;i<=n;i++)
{
for(int j=;j<=m+i-;j++)
{
ins(num[i][j],num[i][j]+cnt,,a[i][j]);
if(i<n)
{
ins(num[i][j]+cnt,num[i+][j],,);
ins(num[i][j]+cnt,num[i+][j+],,);
}
}
}
for(int i=;i<=m;i++) ins(st,i,,);
for(int i=cnt-n-m+;i<=cnt;i++) ins(i+cnt,ed,,);
} int main()
{
init();
for(int i=;i<=len;i++) tt[i]=t[i];
int ans;
ans=max_flow();
printf("%d\n",ans);
for(int i=;i<=len;i++) t[i]=tt[i];
for(int i=;i<=n;i++)
for(int j=;j<=m+i-;j++)
ins(num[i][j],num[i][j]+cnt,INF,a[i][j]);
for(int i=cnt-n-m+;i<=cnt;i++) ins(i+cnt,ed,INF,);
for(int i=;i<=len;i++) tt[i]=t[i];
// output();
ans=max_flow();
printf("%d\n",ans);
// return 0;
for(int i=;i<=len;i++) t[i]=tt[i];
for(int i=;i<=n;i++)
{
for(int j=;j<=m+i-;j++)
{
if(i<n)
{
ins(num[i][j]+cnt,num[i+][j],INF,);
ins(num[i][j]+cnt,num[i+][j+],INF,);
}
}
}
ans=max_flow();
printf("%d\n",ans);
return ;
}

2016-11-06 20:41:45

【网络流24题】No.16 数字梯形问题 (不相交路径 最大费用流)的更多相关文章

  1. [网络流24题] 最长k可重区间集问题 (费用流)

    洛谷传送门 LOJ传送门 很巧妙的建图啊...刚了$1h$也没想出来,最后看的题解 发现这道题并不类似于我们平时做的网络流题,它是在序列上的,且很难建出来二分图的形. 那就让它在序列上待着吧= = 对 ...

  2. 【网络流24题】No.18 分配问题 (二分图最佳匹配 费用流|KM)

    [题意] 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为 cij . 试设计一个将n 件工作分配给 n 个人做的分配方案, 使产生的总效益最大. 输入文件示例input. ...

  3. [网络流24题] 最长k可重线段集问题 (费用流)

    洛谷传送门 LOJ传送门 最长k可重区间集问题的加强版 大体思路都一样的,不再赘述,但有一些细节需要注意 首先,坐标有负数,而且需要开$longlong$算距离 但下面才是重点: 我们把问题放到了二维 ...

  4. LibreOJ 6003. 「网络流 24 题」魔术球 贪心或者最小路径覆盖

    6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 ...

  5. 【网络流24题】No.11(航空路线问题 最长不相交路径 最大费用流)

    [题意] 给定一张航空图, 图中顶点代表城市, 边代表 2 城市间的直通航线. 现要求找出一条满足下述限制条件的且途经城市最多的旅行路线.(1) 从最西端城市出发,单向从西向东途经若干城市到达最东端城 ...

  6. 【网络流24题】No.21 (最长 k 可重区间集问题 最长不相交路径 最大费用流)

    [] 输入文件示例input.txt4 21 76 87 109 13 输出文件示例output.txt15 [分析] 直接co题解好了,写得挺全.. [建模方法] 方法1 按左端点排序所有区间,把每 ...

  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题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

随机推荐

  1. 如何在Linux上安装Storm

    Storm是开源的分布式实时计算系统,能够让数据流处理变得简单.可靠,也因此在大数据领域有广泛的实际 应用.下面介绍一下如何在Linux系统上安装Storm.根据Storm官网介绍,安装Storm软件 ...

  2. CentOS7下用jdk1.7编译hadoop-2.7.1全过程详解

    说实话,本人编译hadoop的过程比较曲折,但收获也很多,下面系统介绍一下CentOS7下编译hadoop-2.7.1的全过程吧. 先说明,32位Linux操作系统可以直接下载编译好的hadoop使用 ...

  3. ng1中 如何用双向绑定 实现单向绑定的初始时不显示双括号效果?

    ng1中 如何用双向绑定 实现单向绑定(ng-bind就可以不显示{{}})的初始时不显示双括号效果? AngularJS 实例 页面加载时防止应用闪烁: <div ng-app="& ...

  4. Unity3D 之UGUI 图片

    这里来降价下Unity3Dl的图片 先创建一个图片 图片的属性 Preserve Aspect -->保持图片的原始宽高比例 Set native Size -->图片原始尺寸 Image ...

  5. wap上传图片跨域发送post请求

    wap和接口交互是跨域请求,一般只能通过Jsonp来进行数据的吞吐,然而jsonp只是GET请求,不能发送post请求,所以会对项目需求有所限制. 需求:wap跨域通过接口上传图片. 条件:接口是C# ...

  6. 页面嵌套 Iframe 产生缓存导致页面数据不刷新问题

    最近遇到个比较古怪的问题:当页面嵌套多个 Iframe 时会出现 Iframe 里包含的页面无法看到最新的页面信息. 初步解决方案,在 Iframe 指向的页面地址后缀添加一个随机数或者时间戳.这样能 ...

  7. 关于使用用友华表Cell控件按需打印行的方法

    分享下只需一个cll文件按需打印行的觉得最好的方式:1.cell文件要打印行的地方最好不要全删了,留一行,设置好单元格样式(字体.对齐方式.折行自适应等),后面会省一些代码: 2.使用CopyRang ...

  8. VC中动态添加控件

    VC中动态添加控件 动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个 ...

  9. IOS-开发日志-UITextField属性

    UITextField属性 0.     enablesReturnKeyAutomatically 属性 默认为No,如果设置为Yes,文本框中没有输入任何字符的话,右下角的返回按钮是disable ...

  10. 尚学堂马士兵Oracle教程笔记

    检查Oracle安装 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba 然后,解除对scott用户的锁 alter user scott account ...