当前位置: 首页 > 编程日记 > 正文

[codevs 1913] 数字梯形问题

[codevs 1913] 数字梯形问题


题解:

本题就是加强版的 [codevs 1033] 蚯蚓的游戏问题。

分别针对三个规则建图、运行最小费用最大流。

规则1:从梯形的顶至底的m条路径互不相交。
分析:因为要互不相交,所以每个点只能走一次,因此要拆点(X->Xi,Xj),容量为1费用为数字相反数,从源点向顶层每个Xi连容量为1,费用为0的边。从底层每个Xj向汇点连一条同样的边。再在相邻边之间连同样的边。最后求解最小费用最大流,取费用相反数就是结果。

规则2:从梯形的顶至底的m条路径仅在数字结点处相交。
分析:仅在数字节点处相交,即一个数字可以经过多次,那么可以放宽Xi和Xj之间容量的限制(由1修改为INF或者m),但注意顶层必须从m个点处引出m条道路,所以顶层的点拆点后的边的容量不能修改(其实改了也没影响),同时还应把底层的Xj连向汇点的边的容量放宽,为了充分利用规则1中已经建好的图,扫一遍边集修改就行了。

规则3:从梯形的顶至底的m条路径允许在数字结点相交或边相交。
分析:这里类比规则2,可以再把相邻点之间的边的容量的限制放宽(由1修改为INF或者m)。注意源点向顶层Xi的边不能改。

利用原有的边建图会更方便更快。

代码:

总时间耗费: 7ms 
总内存耗费: 364B
#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;const int maxn = 400 + 10;
const int INF = 1000000007;int n, m, s, t, delta;
int map[maxn][maxn], ID[maxn][maxn];struct Edge {int from, to, cap, flow, cost;
};vector<Edge> edges;
vector<int> G[maxn];void AddEdge(int from, int to, int cap, int cost) {edges.push_back((Edge){from, to, cap, 0, cost});edges.push_back((Edge){to, from, 0, 0, -cost});int sz = edges.size();G[from].push_back(sz-2);G[to].push_back(sz-1);
}bool inq[maxn];
int a[maxn], d[maxn], p[maxn];bool BellmanFord(int& flow, int& cost) {for(int i = s; i <= t; i++) d[i] = INF;memset(inq, 0, sizeof(inq));d[s] = 0; inq[s] = 1; p[s] = 0; a[s] = INF;queue<int> Q;Q.push(s);while(!Q.empty()) {int x = Q.front(); Q.pop();inq[x] = 0;for(int i = 0; i < G[x].size(); i++) {Edge& e = edges[G[x][i]];if(e.cap > e.flow && d[e.to] > d[x] + e.cost) {d[e.to] = d[x] + e.cost;p[e.to] = G[x][i];a[e.to] = min(a[x], e.cap-e.flow);if(!inq[e.to]) {Q.push(e.to);inq[e.to] = 1;}}}}if(d[t] == INF) return 0;flow += a[t];cost += d[t] * a[t];int x = t;while(x != s) {edges[p[x]].flow += a[t];edges[p[x]^1].flow -= a[t];x = edges[p[x]].from;}return 1;
}void MincostMaxflow() {int flow = 0, cost = 0;while(BellmanFord(flow, cost));cout << -cost << endl;
}void init() {cin >> m >> n;for(int i = 1; i <= n; i++)for(int j = 1; j < m+i; j++) {ID[i][j] = ++t;cin >> map[i][j];}delta = t;t = t * 2 + 1;
}void init_1() {for(int x = 1; x <= n; x++)for(int y = 1; y < x+m; y++) {int& id = ID[x][y];AddEdge(id, id+delta, 1, -map[x][y]);if(x == 1) AddEdge(s, id, 1, 0);if(x == n) AddEdge(id+delta, t, 1, 0); //key1else {AddEdge(id+delta, ID[x+1][y], 1, 0);AddEdge(id+delta, ID[x+1][y+1], 1, 0);}}
}void init_2() {for(int x = 1; x <= delta; x++) for(int i = 0; i < G[x].size(); i++) //key 2if(edges[G[x][i]].to == x + delta) {edges[G[x][i]].cap = m;break;}for(int y = 1; y < n+m; y++) {int x = ID[n][y] + delta;for(int i = 0; i < G[x].size(); i++) if(edges[G[x][i]].to == t) edges[G[x][i]].cap = m; //key 4}for(int i = 0; i < edges.size(); i++) edges[i].flow = 0;
}void init_3() {for(int i = 0; i < edges.size(); i++) {Edge& e = edges[i];e.flow = 0;if(e.cap && e.from != s) e.cap = m; //key 3}
}void debug() {for(int i = 0; i < edges.size(); i++) {Edge& e = edges[i];if(e.cap) printf("%d %d %d %d\n", e.from, e.to, e.cap, e.cost);}
}void regulation_1() {init_1();//debug();MincostMaxflow();
}void regulation_2() {init_2();//debug();MincostMaxflow();
}void regulation_3() {init_3();//debug();MincostMaxflow();
}int main() {init();regulation_1();regulation_2();regulation_3();return 0;
}


转载于:https://www.cnblogs.com/wfwbz/p/4282482.html

相关文章:

PAT(甲级)2019年秋季考试 7-2 Merging Linked Lists

又是老朋友链表输出题&#xff0c;依然采用哈希静态存储&#xff0c;但是这题稍复杂的是&#xff0c;有两条链表&#xff0c;但是我们可以默认link1>link2&#xff0c;然后让link2上的节点接着link1后面编号&#xff0c;并且注意link2是倒序输出的。 输出时有几个关键点&am…

Flash/Flex学习笔记(4):如何打开网页及Get/Post数据

flash终究只是客户端技术&#xff0c;所以很多时候还是需要与服务端技术(比如asp,asp.net,jsp,php之类)进行数据交互的&#xff0c;下面的代码演示了如何在flash中打开网页&#xff0c;以及用GET/POST二种方式向服务端发送数据//按下按钮&#xff0c;打开网页 btnOpen.addEvent…

【Mood 19】DailyBuild 2月

2月1号 仿美团loading时小人奔跑动画 HTML5定稿了&#xff0c;为什么原生App世界将被颠覆&#xff1f; -----HTML5一改过去卡顿不兼容的毛病&#xff0c;在硬件升级以及苹果谷歌策略变化的背景下&#xff0c;让自己的优势相对于原生开发更加明显起来&#xff1a; 对开发者的“跨…

(二)spring cloud微服务分布式云架构 - 整合企业架构的技术点

spring cloud本身提供的组件就很多&#xff0c;但我们需要按照企业的业务模式来定制企业所需要的通用架构&#xff0c;那我们现在需要考虑使用哪些技术呢&#xff1f; 下面我针对于spring cloud微服务分布式云架构做了以下技术总结&#xff0c;希望可以帮助到大家&#xff1a; …

用拓扑排序检测有向图中是否有环

目录 算法主要步骤 代码 测试数据 提示&#xff1a;由于拓扑排序的检测方式不涉及到边权或点权&#xff0c;所以拓扑序列中的正环和负环都能够被检测出来。检测可达负环可以用Bellman-Ford或者SPFA。 算法主要步骤 1. 记录每个结点的入度&#xff0c;设置一个队列&#xf…

关于大型网站技术演进的思考(五)--存储的瓶颈(5)

上文里我遗留了两个问题&#xff0c;一个问题是数据库做了水平拆分以后&#xff0c;如果我们对主键的设计采取一种均匀分布的策略&#xff0c;那么它对于被水平拆分出的表后续的查询操作将有何种影响&#xff0c;第二个问题就是水平拆分的扩容问题。这两个问题在深入下去&#…

Project Chameleon Work In Progress 10

现在的进展是&#xff0c;UMDF驱动的DeviceIOControl和Read、Write已经都能使用了&#xff0c;并且FX2LP的EP6IN也正常工作&#xff0c;下面是工作中的测试代码截图&#xff1a; 转载于:https://www.cnblogs.com/skogkatt/archive/2010/03/13/4163356.html

maven项目中 把依赖的jar包一起打包

2019独角兽企业重金招聘Python工程师标准>>> Maven1-HelloWorld简单入门 使用Maven Assembly plugin将依赖打包进jar 1、pom.xml 配置文件&#xff1a; 在pom.xml配置文件中添加 <build> <plugins> <plugin> <artifactId>maven-assembly…

PAT(甲级)2019年春季考试 7-4 Structure of a Binary Tree

目录 整体思路 犯的错误 代码 整体思路 1.先根据后序和中序序列建树&#xff0c;老生常谈&#xff0c;记得返回root 2.对树进行BFS&#xff0c;在这个过程中用hash的方式记录下每个值对应的父节点、左孩子、右孩子的值&#xff0c;记录下深度(即层数)&#xff0c;还有孩子…

vs2008 常用快捷键

编辑快捷键 CtrlB,T 切换书签开关 CtrlB,N 移动到下一书签 CtrlB,P 移动到上一书签 CtrlB,C 清除全部标签 CtrlI 渐进式搜索 CtrlShiftI反向渐进式搜索 F12 转到定义 AltF12 查找符号(列出所有查找结果) CtrlF 查找 CtrlH 替换 CtrlShi…

我理解的观察者模式

什么是观察者模式&#xff1f; 当对象间存在一对多关系时,比如&#xff0c;当一个对象被修改时&#xff0c;则会自动通知它的依赖对象。观察者模式也叫做发布订阅模式。 观察者模式有什么好处&#xff1f; 观察者模式中&#xff0c;被观察者发生改变时&#xff0c;会自动通知所…

PAT(甲级)2019年春季考试 7-3 Telefraud Detection

1. 这题复杂在诈骗检测算法的理解 怎样的一个人会被判定成嫌疑犯呢&#xff1f; 他打出给别人的累计通话时长的不同的人数大于K 注意&#xff1a;不同和累计 怎样的两个人会被判定成同伙呢&#xff1f; 相互之间有通话记录 2. 同伙的合并我采用的并查集&#xff0c;在设置…

Linux基础命令---diffstat

diffstat这个程序读取diff的输出&#xff0c;并显示每个文件的插入、删除和修改的直方图。Diffstat是一个用于检查大型复杂修补程序文件的程序。它从包含diff输出的一个或多个输入文件中读取&#xff0c;生成针对引用的每个文件更改的总行的直方图。如果输入文件名以.bz 2、.gz…

两个asp.net发送邮件类

代码 //第一个usingSystem;usingSystem.Text;usingSystem.Net.Mail;namespaceCars.Tootls.Tools{ publicclassEmail { privateEmail() { } ///<summary>///发送邮件 ///</summary>///<param name"Su…

symfony2是什么?

首先&#xff0c;symfony2是一个松散的&#xff0c;独立的&#xff0c;有组织严密的php组件的集合&#xff0c;它可以为你解决一些web开发中一般性的问题。 其次&#xff0c;基于这些组件&#xff0c;php又可以作为一个独立web框架使用。 转载于:https://www.cnblogs.com/ljcph…

PAT(甲级)2019年春季考试 7-2 Anniversary

注意点 1. 记录是不是校友&#xff0c;有两种方法 &#xff08;1&#xff09;map<string,int> mp mo[guest] 1 判断mp[comer] &#xff08;2&#xff09;set<string> st st.insert(guest) st.count(comer) 2. 由于只需要输出年龄最大的&…

根据总用量计算每种包装规格的购买量和总价

最近有这么一个需求&#xff0c;就是给出客户需要的总量&#xff0c;然后根据数据库记录的包装规格&#xff0c;计算出客户需要购买的包装规格种类和个数&#xff0c;而且要保证客户的花费最小。 示例图片效果 示例代码实现如下。欢迎大家一起讨论。 代码 using System;using S…

5个在线调试代码的网站

对于编程开发的人来说&#xff0c;有个快速测试代码的地方是非常方便重要的&#xff0c;这里&#xff0c;我们收集了5个很好用的在线调试网站。 1.codepad 是一款简单的在线 IDE 编辑器服务&#xff0c;你只需要把代码粘贴进去就可以编译运行了&#xff0c;连工程也不需要新建&…

Windows 日志高级筛选实践

背景经常需要查看日志&#xff0c;不仅是用来排错&#xff0c;有些时候我还需要监控系统来抓取特定日志来帮助减少我的工作负担&#xff0c;以及时监控到异常出现&#xff0c;并作出通知及响应&#xff0c;那么从大量日志中快速并精确筛选出想要的日志&#xff0c;并且精确提取…

PAT(甲级)2018年秋季考试 7-1 Werewolf - Simple Version

1. 我设置了一个结构体变量存储每个人的指控信息 struct IF{int type 0;int no; }; 这里我发现了一件事&#xff0c;如果结构体只有有参数的构造函数&#xff0c;那么直接声明该结构体类型的数组是不行的。但是好处是数组知道下标可以直接赋值。 也就是这样组合最好&#x…

appium 启动失败解决方案

本机下载了&#xff1a;AppiumForWindows&#xff0c;启动Appium.exe 的时候&#xff0c;立即提示&#xff1a;应用程序已停止运行&#xff01;&#xff01; 本机环境&#xff1a; WIN 7 64 位&#xff0c;后来查了资料才知道Appium 要求安装.net framework 4.5&#xff0c;本机…

Django基础-数据分页

2019独角兽企业重金招聘Python工程师标准>>> pager.py # -*- coding:utf8 -*- """ 引用说明&#xff1a; 数据总个数&#xff1a;total_count 数据总页数&#xff1a;num_pages 每页显示的行数&#xff1a;perPageItemNum【默认显示10行】 最多显示页…

存货的计划属性设置(ATO模型和PTO模型)

对于原来应用ERP1时已经存在的存货&#xff0c;如果在存货属性中没有进行过设置或者设置不完善&#xff0c;需要进行补充设置。这样的补充设置包括&#xff1a; 自制&#xff1a;具有该属性的存货可由企业生产自制。如工业企业生产的产成品、半成品等存货。具有该属性的存货可用…

(C++)判断一个序列是non-increasing/non-decreasing还是两者都不的两个方法

思路&#xff1a;根据前两个值预设类型&#xff0c;再遍历后面的pair&#xff0c;看是否推翻预设 int judgeType(vector<int> vi){//-1 递减 0 啥也不是 1 递增 if(vi.size()1)return 0;//根据前两个元素的大小设置初始类型int type;if(vi[1]>vi[0])type 1;else …

java 下载文件功能代码例子

public static void down(HttpServletRequest request, HttpServletResponse response) throws Exception { String name"aaa.*";//文件名 String uploadPath UploadFileHelper.getRepositoryPath()"//";//文件来源 String filePath…

不要小看字符串

字符串非常非常常见又重要&#xff0c;而且还有那么多名堂在里面 字符串: 在标准C中&#xff0c;是没有字符串变量的&#xff0c;但是有字符数组。而且标准C带有的标准库函数&#xff1a;string.h中包含了大量的字符串操作函数&#xff0c;当然如果必要的话&#xff0c;你也可以…

零基础学习Python需要注意的几个点,Python培训机构排名

俗话说的好万事开头难&#xff0c;不管你做任何事情&#xff0c;开头的确很较难的&#xff0c;学Python编程也是如此&#xff0c;因此刚开始学Python编程的同学们&#xff0c;就要多借鉴过来人的经验&#xff0c;少走弯路&#xff0c;本文小编就为大家分享几个Python编程小白初…

PAT(甲级)2018年冬季考试 7-4 Heap Paths(非递归与递归解法)

非递归解法 1. 前置知识&#xff1a;完全二叉树的属性 1.1 从1开始存储&#xff0c;子节点的下标除以二得到的是父节点的下标 1.2 数组的存放顺序刚好是层序遍历顺序 1.3 从1开始存储&#xff0c;节点的下标i和结点总数n如果满足 i*2>n说明该结点是叶子结点 2. 思路&am…

Request Connection: Remote Server @ 192.229.145.200:80

录制Loadrunner脚本时&#xff0c;提示&#xff1a;Request Connection: Remote Server 192.229.145.200:80 NOT INTERCEPTED!(REASON: User requested to IGNORE connection)&#xff1b;解决方法&#xff1a;1. 打开IE里的Internet选项&#xff0c;单击连接选项卡。单击最…

抽象工厂与工厂模式例子

NativeFactory。java package com;//定义 人有杀日本人 和 杀美国人两个方法interface NativePerson{ public void killAmeria(); public void killJapan();}//中国人实现了人的接口 class NativeChinese implements NativePerson{ //中国人杀美国人 public void killAmeria() …