网络流二十四题之十六 —— 数字梯形问题(DIGIT)
来源:互联网 发布:淘宝优惠券招代理 编辑:程序博客网 时间:2024/05/18 01:23
数字梯形问题
Description
给定一个由
梯形的第一行有
从梯形的顶部的
至底的路径。
规则1:从梯形的顶至底的
规则2:从梯形的顶至底的
规则3:从梯形的顶至底的
对于给定的数字梯形,分别按照规则1,规则2,和规则3 计算出从梯形的顶至底的
Input
第
接下来的
第
Output
将按照规则1,规则2,和规则3计算出的最大数字总和输出。
每行一个最大总和。
Sample Input
2 5
2 3
3 4 5
9 10 9 1
1 1 10 1 1
1 1 10 12 1 1
Sample Output
66
75
77
Solution
很简单的费用流题目——只要拆点就可以了。
Code
- #include <iostream>
- #include <cstdio>
- #include <queue>
- #include <cstring>
- #define PLA(x,y) PLA[(x)][(y)]
- #define Min(x,y) ((x)<(y)?(x):(y))
- #define Max(x,y) ((x)>(y)?(x):(y))
- #define ANOTHER 2000
- #define INF 0x3f3f3f3f
- #define ss 0
- #define tt 5000
- using namespace std;
- int n,m,tmp,ans,cnt;
- int maps[100][100];
- int f[100][100];
- int head[10010],nxt[1000100],wei[1000100],flow[1000100],data[1000100];
- int PLA[1000][1000];
- int dis[10010];
- int pre[10010];
- bool in_stack[10010];
- queue<int>q;
- void add(int x,int y,int a,int b){
- nxt[cnt]=head[x];data[cnt]=y;wei[cnt]=b;flow[cnt]=a;head[x]=cnt++;
- nxt[cnt]=head[y];data[cnt]=x;wei[cnt]=-b;flow[cnt]=0;head[y]=cnt++;
- }
- bool BFS(){
- memset(dis,0x3f,sizeof dis);dis[ss]=0;in_stack[ss]=true;q.push(ss);pre[ss]=pre[tt]=-1;
- while(!q.empty()){
- int now=q.front();
- q.pop();
- in_stack[now]=false;
- for(int i=head[now];i!=-1;i=nxt[i]){
- if(flow[i]!=0&&dis[data[i]]>dis[now]+wei[i]){
- dis[data[i]]=dis[now]+wei[i];
- pre[data[i]]=i^1;
- if(!in_stack[data[i]]){
- in_stack[data[i]]=true;
- q.push(data[i]);
- }
- }
- }
- }
- return pre[tt]!=-1;
- }
- void dfs(){
- int Low=INF;
- for(int i=pre[tt];i!=-1;i=pre[data[i]])Low=Min(Low,flow[i^1]);
- for(int i=pre[tt];i!=-1;i=pre[data[i]])flow[i^1]-=Low,flow[i]+=Low;
- ans+=Low*dis[tt];
- }
- int main(){
- freopen(”digit.in”,“r”,stdin);
- freopen(”digit.out”,“w”,stdout);
- memset(head,-1,sizeof head);
- scanf(”%d%d”,&m,&n);tmp=m;
- int tot=0;
- for(int i=1;i<=n;i++,tmp++)
- for(int j=1;j<=tmp;j++)
- PLA[i][j]=++tot;
- tmp=m;
- for(int i=1;i<=n;i++,tmp++)
- for(int j=1;j<=tmp;j++){
- scanf(”%d”,&maps[i][j]);
- if(i!=n){
- add(PLA(i,j),PLA(i+1,j)+ANOTHER,1,0);
- add(PLA(i,j),PLA(i+1,j+1)+ANOTHER,1,0);
- }
- }
- for(int i=1;i<=n+m-1;i++)add(PLA(n,i),tt,1,0);
- for(int i=1;i<=m;i++)add(ss,PLA(1,i)+ANOTHER,1,0);
- tmp=m;
- for(int i=1;i<=n;i++,tmp++)
- for(int j=1;j<=tmp;j++)
- add(PLA(i,j)+ANOTHER,PLA(i,j),1,-maps[i][j]);
- while(BFS())dfs();
- printf(”%d\n”,-ans);
- memset(head,-1,sizeof head);
- cnt=0;
- for(int i=1;i<=m;i++)add(ss,PLA(1,i),1,0);
- for(int i=1;i<=n+m-1;i++)add(PLA(n,i),tt,INF,-maps[n][i]);
- tmp=m;
- for(int i=1;i<=n;i++,tmp++)
- for(int j=1;j<=tmp;j++){
- if(i!=n){
- add(PLA(i,j),PLA(i+1,j),1,-maps[i][j]);
- add(PLA(i,j),PLA(i+1,j+1),1,-maps[i][j]);
- }
- }
- ans=0;
- while(BFS())
- dfs();
- printf(”%d\n”,-ans);
- ans=0;
- tmp=n+m-2;
- for(int i=1;i<=tmp+1;i++)f[n][i]=maps[n][i];
- for(int i=n-1;i>=1;i–,tmp–)
- for(int j=1;j<=tmp;j++)
- f[i][j]=Max(f[i+1][j],f[i+1][j+1])+maps[i][j];
- for(int i=1;i<=m;i++)ans+=f[1][i];
- printf(”%d\n”,ans);
- return 0;
- }
0 0
- 网络流二十四题之十六 —— 数字梯形问题(DIGIT)
- 网络流二十四题之二十四 —— 骑士共存问题(KNI)
- 数字梯形问题[网络流24题之16]
- 【网络流24题】数字梯形问题
- [网络流24题]数字梯形问题
- 网络流二十四题之十四 —— 孤岛营救问题(RESCUE)
- 线性规划与网络流24——数字梯形问题
- 网络流二十四题之二 —— 太空飞行计划问题(SHUT)
- 网络流二十四题之三 —— 最小路径覆盖问题(PATH)
- 网络流二十四题之四 —— 魔术球问题(BALL)
- 网络流二十四题之五 —— 圆桌问题(TABLE)
- 网络流二十四题之七 —— 试题库问题(DATA)
- 网络流二十四题之九 —— 方格取数问题(GRID)
- 网络流二十四题之十 —— 星际转移问题(HOME)
- 网络流二十四题之十 —— 餐巾计划问题(NAPK)
- 网络流二十四题之十一 —— 航空路线问题(AIRL)
- 网络流二十四题之十二 —— 软件补丁问题(BUG)
- 【网络流24题-16】数字梯形问题 费用流
- Android通用流行框架大全
- js 打开url
- Android studio添加依赖工程
- JdbcRowMapper-JDBC泛型查询对象封装
- acl 库下载信息
- 网络流二十四题之十六 —— 数字梯形问题(DIGIT)
- 内网FTPpassword嗅探
- ajax跨域解决办法
- 如何把UIView转成UIImage,解决模糊失真问题
- 类型“Microsoft.Office.Interop.Word.ApplicationClass”未定义构造函 无法嵌入互操作类型“Microsoft.Office.Interop.Word.App
- jQuery scrollFix滚动定位插件
- Python 进阶 —— 函数式编程
- Leetcode 75. Sort Colors 色彩排序 解题报告
- 移植uboot-1.1.6到勤研2440