![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法竞赛入门经典训练指南-第五章
文章平均质量分 74
lab104_yifan
这个作者很懒,什么都没留下…
展开
-
UVA 1306 - The K-League(网络流)
UVA 1306 - The K-League题目链接题意:n个球队,已经有一些胜负场,现在还有一些场次,你去分配胜负,问每支球队有没有可能获胜思路:网络流公平分配模型,把场次当作任务,分配给人,然后先贪心,枚举每个人,让这些人能赢的都赢,剩下的去建图,每个源点连向比赛容量为场次,每个比赛连向2个球队,容量无限大,每个球队连向汇点,容量为每个的人的总和减去当前已经赢的,建完原创 2014-10-10 22:35:40 · 1341 阅读 · 0 评论 -
UVA 10537 - The Toll! Revisited(dijstra扩展)
UVA 10537 - The Toll! Revisited题目链接题意:给定一个无向图,大写字母是城市,小写字母是村庄,经过城市交过路费为当前货物的%5,路过村庄固定交1,给定起点终点和到目标地点要剩下的货物,问最少要带多少货物上路,并输出路径,如果有多种方案,要求字典序最小思路:dijstra的逆向运用,d数组含义变成到该结点至少需要这么多货物,然后反向建图,从终点向原创 2014-09-02 23:41:53 · 2026 阅读 · 0 评论 -
UVA 10917 - Walk Through the Forest(dijstra)
UVA 10917 - Walk Through the Forest题目链接题意:公司编号为1,家编号为2,每次回家都不走回头路,回头路定义为:满足条件的道路(A,B),满足存在一条从B出发比所有从A出发的回家的路径都短,问有几种走法思路:先从家求dijstra,这样满足条件的道路就是d[A] > d[B],这个图是一个dag,在上面进行dp就可以找出种数了代码:原创 2014-09-02 15:33:04 · 853 阅读 · 0 评论 -
UVA 1395 - Slim Span(MST)
UVA 1395 - Slim Span题目链接题意:给定一些结点和边,要求出最苗条度最小的生成树,苗条度定义为:生成树中最大权的边减去最小权的边的值思路:类似建最小生成树的算法,多一步枚举起始边即可代码:#include #include #include using namespace std;const int N = 105;const原创 2014-09-24 15:04:45 · 1213 阅读 · 0 评论 -
UVA 11930 - Rectangles(2-sat + 计算几何)
UVA 11930 - Rectangles题目链接题意:给定一些矩形,每个在两条对角线选一条,保证全部不相交,问可不可行(这题有坑啊,矩形不一定平行坐标轴。。。)思路:2-sat,主对角线为true,副对角线为false,枚举两个矩形的每条对角线,利用叉积判相交,如果相交就加一条边进去,最后2-sat判定即可代码:#include #include #原创 2014-09-02 10:26:48 · 952 阅读 · 0 评论 -
UVA 1416 - Warfare And Logistics(最短路树)
UVA 1416 - Warfare And Logistics题目链接题意:给定一个无向图,每个边一个正权,c等于两两点最短路长度之和,现在要求删除一边之后,新图的c值最大的是多少思路:直接枚举删边,每次做一次dijkstra的话复杂度太高,其实如果建好最短路树,如果删去的边在最短路树上,才需要去做,这样复杂度就优化到(n^2mlog(n)),勉强可以接受代码:原创 2014-09-02 17:05:48 · 1191 阅读 · 0 评论 -
UVA 11374 - Airport Express(dijstra)
UVA 11374 - Airport Express题目链接题意:给定一些经济线,和一些商务线,商务线最多坐一次,每个线有一个时间,问最短时间思路:从起点,终点各做一次dijstra,然后枚举商务线,就可以算出总时间,最后求出总时间最少代码:#include #include #include #include using namespace st原创 2014-09-02 14:24:57 · 1014 阅读 · 0 评论 -
UVA 11853 - Paintball(dfs)
UVA 11853 - Paintball题目链接题意:就是给定一些圆,判断能否不经过这些圆从左边走到右边,如果可以要求起始和终止位置尽量往北,输出位置思路:每次找一个超出上边界的圆dfs,如果能到下边界,就是隔断了肯定到达不了,如果隔断左右边界,就要更新答案的值代码:#include #include #include #include #incl原创 2014-09-24 18:33:29 · 2033 阅读 · 0 评论 -
UVA 10246 - Asterix and Obelix(最短路)
UVA 10246 - Asterix and Obelix题目链接题意:给定一个图,每个点有一个代价,边有一个代价,现在有q次询问,每次询问从u到v的最小花费,花费的计算方式为,路径代价加上路径上最大代价结点的代价思路:枚举最大代价结点,然后做dijkstra,做的过程中忽略掉比枚举点更大代价的点,然后更新所有的答案,预处理完成后每次询问就可以在O(1)时间内完成了原创 2014-09-24 19:39:53 · 1498 阅读 · 0 评论 -
UVA 610 - Street Directions(割边)
UVA 610 - Street Directions题目链接题意:给定一个无向图,要求把尽可能多的边定向,使得形成一个强连通图,输出定向后的图,不能定向的边就变成两条有向边思路:找出割边,只有割边是需要定成两条的,其他的双连通分量中,边肯定都可以定向,然后在dfs不经过割边打印路径,最后在打印出割边(拆成两条)代码:#include #include原创 2014-09-01 00:15:55 · 1636 阅读 · 2 评论 -
UVA 1086 - The Ministers' Major Mess(2-sat)
UVA 1086 - The Ministers' Major Mess题目链接题意:有n个方案,每个人投票,一个人最多投4张票,现在要有一个方案,使得满足所有人投票方案中有超过一半被满足,输出方案的对错,如果一个方案对错都可以,就输出?思路:明显是二分图,一开始想错了,想从正着去把条件式化简,根本不可行正确的做法是,反过来想,因为最多4张票并且超过1半,如果反过来原创 2014-09-01 18:22:35 · 1488 阅读 · 0 评论 -
UVA 10972 - RevolC FaeLoN(边-双连通分量)
UVA 10972 - RevolC FaeLoN题目链接题意:给定一个无向图(不一定全连通),现在把边定向,问还要添加几条边使得图强连通思路:先求出边-双连通分量,每个连通分量都能定向,然后缩点,转化为欧拉回路,如果每个点度数都是大于等于2的偶数就是回路,也就是强连通了,所以计算度数为0和1的个数,一条边能增加两个度数,所以答案为所以只要再添加上(a + 1) / 2 +原创 2014-09-01 11:22:43 · 1794 阅读 · 0 评论 -
UVA 1514 - Piece it together(二分图匹配+拆点)
UVA 1514 - Piece it together题目链接题意:给定一个棋盘,上面有黑白或者空,现在有一种L型拼图如图,问能否拼出给定图案,拼图不能重叠思路:二分图匹配,拆点,对于每个黑点,拆点两个点,一个和横向连,一个和纵向连,然后进行二分图最大匹配,如果能完美匹配就是正确的代码:原创 2014-09-01 20:55:30 · 1501 阅读 · 0 评论 -
UVA 10510 - Cactus(有向仙人掌图判定)
UVA 10510 - Cactus题目链接题意:给定一个有向图,问这个图是否为仙人掌图(一条边不属于两个及以上环)思路:类似构造scc的dfs,判定方法为:1、必然是一个强连通分量2、一个环上的节点必然只能经过一次那么dfs的时候,只要记录下每个结点的父亲结点,如果遇到一个结点之前遍历过了,那么就回退的找到改结点,把环上的结点都+1(注意当前结点不算,因为原创 2014-09-01 16:27:08 · 1533 阅读 · 0 评论 -
UVA 11504 - Dominos(强连通分量)
UVA 11504 - Dominos题目链接题意:给定一个多米诺骨牌的有向图,为最多要推几个才能全倒思路:强连通分量,缩点后找出度数为0的点就是答案代码:#include #include #include #include #include using namespace std;const int N = 100005;vector原创 2014-08-31 22:22:15 · 1419 阅读 · 2 评论 -
UVA 11294 - Wedding(Two-Set)
UVA 11294 - Wedding题目链接题意:有n对夫妻,0号是公主,现在有一些通奸关系(男男,女女也是可能的)然后要求人分配在两侧,夫妻不能坐同一侧,并且公主对面一侧不能有两个同奸的人,问方案思路:2-set,建图,一共2n个人,设偶数是丈夫,奇数是妻子,左侧为false,右侧为true,然后丈夫妻子建一条true false 或 false true的边,然后然公原创 2014-08-31 11:57:55 · 1481 阅读 · 0 评论 -
UVA 11080 - Place the Guards(二分图判定)
UVA 11080 - Place the Guards题目链接题意:一些城市,之间有道路相连,现在要安放警卫,警卫能看守到当前点周围的边,一条边只能有一个警卫看守,问是否有方案,如果有最少放几个警卫思路:二分图判定,判定过程记录下白点和黑点个数,小的就是要安放的个数,注意如果是0,那么应该是加1代码:#include #include #include原创 2014-08-31 16:17:03 · 1644 阅读 · 0 评论 -
UVA 10319 - Manhattan(2-SET)
UVA 10319 - Manhattan题目链接题意:一个城市,有南北和东西街道,每种街道都是单行道,现在给定几个起点和终点,要求起点和终点必须最多转一次弯可以到达,问是否可以满足所有的起点终点思路:2-set,对于东西,南北街道,向西(北)为false,向东(南)为true,对于每个起点终点,肯定是走坐标对应的那4条街道,表示出来是(s1 & a2) | (s2 & a原创 2014-08-31 15:30:26 · 1952 阅读 · 0 评论 -
UVA 11090 - Going in Cycle!!(Bellman-Ford)
UVA 11090 - Going in Cycle!!题目链接题意:给定一个有向图,球平均权值最小的回路思路:二分+判负环,每次二分一个值mid,判断是否存在小于mid的环,那么就是(w1 + w2 + w3...) / n 代码:#include #include #include #include #include using namespa原创 2014-09-03 00:09:53 · 1760 阅读 · 0 评论 -
UVA 1078 - Steam Roller(最短路)
UVA 1078 - Steam Roller题目链接题意:给定一个地图,要求起点走到终点需要的时间,如果进入一个转弯位置,则进入和出去的时候时间要加倍思路:最短路,关键在于如何建模,每个结点d[x][y][d][flag]表示在x, y结点,方向为d,是否加倍过了,这样就可以把每个结点之间对应的关系建边,做最短路即可代码:#include #includ原创 2014-09-26 19:30:01 · 1675 阅读 · 0 评论 -
UVA 1048 - Low Cost Air Travel(最短路)
UVA 1048 - Low Cost Air Travel题目链接题意:给定一些联票,在给定一些行程,要求这些行程的最小代价思路:最短路,一张联票对应几个城市就拆成多少条边,结点表示的是当前完成形成i,在城市j的状态,这样去进行最短路,注意这题有坑点,就是城市编号可能很大,所以进行各种hash代码:#include #include #include原创 2014-09-26 21:21:12 · 1738 阅读 · 0 评论 -
UVA 11354 - Bond(树链剖分)
UVA 11354 - Bond题目链接题意:给定一个图,要求每次询问两点,求出这两点间路径最大危险系数最小思路:先求最小生成树,在生成树上每次询问求LCT就可以了,利用树链剖分求解代码:#include #include #include #include using namespace std;#define lson(x) ((x<<1)+原创 2014-09-30 17:42:44 · 1110 阅读 · 0 评论 -
UVA 816 - Abbott's Revenge(BFS)
UVA 816 - Abbott's Revenge题目链接题意:一个迷宫,每个点限制了从哪一方向来的,只能往左右前走,然后问起点到终点的最短路径思路:BFS,每个点拆成4个方向的点,对应能走的方向建图跑一下bfs即可代码:#include #include #include #include #include using namespace st原创 2014-10-10 19:15:16 · 3100 阅读 · 0 评论 -
UVA 810 - A Dicey Problem(BFS)
UVA 810 - A Dicey Problem题目链接题意:一个骰子,给你顶面和前面,在一个起点,每次能移动到周围4格,为-1,或顶面和该位置数字一样,那么问题来了,骰子能不能走一圈回到原地,输出路径,要求最短,如果有多个最短,按照上下左右输出思路:读懂题就是水题,就记忆化搜一下即可,记录状态为位置和骰子顶面,正面(因为有两面就能确定骰子了)代码:#in原创 2014-10-10 18:02:55 · 2820 阅读 · 0 评论 -
UVA 1212 - Duopoly(最小割)
UVA 1212 - Duopoly题目链接题意:两个公司,每个公司都有n个开价租用一些频道,一个频道只能租给一个公司,现在要求出一个分配方案使得收益最大思路:最小割,源点连到第一个公司,第二个公司连到汇点,容量均为价钱,然后第一个公司和第二个公司有冲突的就连一条边容量为无穷大,然后求这个图的最小割就是去掉最小多少使得图原图不会冲突了,然后用总金额减去最小割的值即可原创 2014-09-25 16:53:36 · 934 阅读 · 0 评论 -
UVA 1317 - Concert Hall Scheduling(网络流)
UVA 1317 - Concert Hall Scheduling题目链接题意:现在有两个音乐厅,有一些人要租用,每次租一个区间的时间,给w钱,要求一个租的方案使得总收入最大,问总收入思路:区间k覆盖问题,一个左闭右开区间可以建一条边,容量为1,代价为-w(因为要求最大),然后区间每个[i, i + 1]建一条边,容量2,代价0,然后跑一下费用流即可代码:原创 2014-09-25 14:09:47 · 1206 阅读 · 0 评论 -
UVA 1349 - Optimal Bus Route Design(KM完美匹配)
UVA 1349 - Optimal Bus Route Design题目链接题意:给定一些有向带权边,求出把这些边构造成一个个环,总权值最小思路:由于环入度出度为1,所以可以把每个点拆成入度点和出度点,然后建图做一次二分图完美匹配即可,注意这题坑点,有重边代码:#include #include #include #include using na原创 2014-09-25 10:37:59 · 1681 阅读 · 0 评论 -
UVA 12168 - Cat vs. Dog(二分图匹配+最大独立集)
UVA 12168 - Cat vs. Dog题目链接题意:给定一些猫爱好者,和一些狗爱好者,每个人都有一个喜欢的猫(狗),和一个讨厌的狗(猫),要问现在给一种方案,使得尽量多的人被满足思路:二分图匹配最大独立集,猫爱好者和狗爱好者矛盾的建边,做一次最大独立集即可代码:#include #include #include using namespace原创 2014-09-04 18:58:04 · 2246 阅读 · 0 评论 -
UVA 1411 - Ants(二分图完美匹配)
UVA 1411 - Ants题目链接题意:给定一些黑点白点,要求一个黑点连接一个白点,并且所有线段都不相交思路:二分图完美匹配,权值存负的欧几里得距离,这样的话,相交肯定比不相交权值小,所以做一次完美匹配就可以了代码:#include #include #include #include using namespace std;const in原创 2014-09-04 12:00:49 · 2225 阅读 · 0 评论 -
UVA 1486 - Transportation(网络流+拆边)
UVA 1486 - Transportation题目链接题意:一个有向图上运输k货物,有一些边,每个边一个系数a,经过该边如果有x货物,就要缴纳a x x的钱,问运输从1到n最小的代价思路:费用流,这题边的容量c最大只有5,所以可以拆边,一条边拆成c条边,每条容量1,对应相应的代价为a * (i^2 - (i - 1)^2),然后跑一下费用流即可代码:原创 2014-09-25 15:07:01 · 1032 阅读 · 0 评论 -
UVA 11383 - Golden Tiger Claw(二分图完美匹配扩展)
UVA 11383 - Golden Tiger Claw题目链接题意:给定每列和每行的和,给定一个矩阵,要求每个格子(x, y)的值小于row(i) + col(j),求一种方案,并且所有行列之和的和最小思路:A二分图完美匹配的扩展,行列建二分图,权值为矩阵相应位置的值,做一次KM算法后,所有顶标之和就是最小的代码:#include #include原创 2014-09-04 12:40:55 · 965 阅读 · 0 评论 -
UVA 12083 - Guardian of Decency(二分图最大匹配)
UVA 12083 - Guardian of Decency题目链接题意:给定一些男女,满足身高差不大于40,喜欢同一种音乐,不喜欢同一种体育项目,并且性别不同,就可能发生关系,现在老师要带一些男女出去玩,要求不能有一对发生关系,问最多能带多少人思路:分男女,把会发生关系的连边,然后做最大匹配,最后n-最大匹配就是最多能带的人代码:#include #i原创 2014-09-03 23:08:26 · 1287 阅读 · 0 评论 -
UVA 11380 - Down Went The Titanic(网络流)
UVA 11380 - Down Went The Titanic题目链接题意:给定一个图,上面有薄冰'.'或'*‘,厚冰'@',木块'#',一开始人都在'*'上,薄冰只能走一次就会沉掉,厚冰次数不限,如果人走到木块上就获救了,但是一个木块的容量只有p,求最多能有多少人获救思路:最大流,由于点有次数限制,所以可以进行拆点,然后建图每个4和四个方向建边,源点和'*'建边,'#原创 2014-09-25 11:29:01 · 1831 阅读 · 0 评论 -
UVA 11419 - SAM I AM(二分图匹配+最小点覆盖)
UVA 11419 - SAM I AM题目链接题意:给定一个棋盘,上面有一些目标,现在要放炮,一个炮能打一行或一列,问最少放几个炮及放炮位置思路:首先是二分图匹配,每个目标行列建边,做二分图匹配就是最少的放炮位置,至于输出方案,利用最小点覆盖的Konig原理去做,详细证明代码:#include #include #include using name原创 2014-09-03 21:38:03 · 1009 阅读 · 0 评论 -
UVA 11478 - Halum(差分约束+最短路)
UVA 11478 - Halum题目链接题意:给定一个有向图,每次操作可以选择一个结点,把以这个点为起点的边权值+d,以这个边为终点的-d,问经过操作后,能得到的边权最小的最大值是多少,并且要判但是否无穷大或无解思路:转化为差分约束,设一条边,他增加的权值为sum(u)减少了sum(v),那么二分答案x,得到一个不等式sum(u) - sum(v) + w(u, v) >原创 2014-09-03 10:29:40 · 960 阅读 · 0 评论 -
UVA 1201 - Taxi Cab Scheme(二分图匹配+最小路径覆盖)
UVA 1201 - Taxi Cab Scheme题目链接题意:给定一些乘客,每个乘客需要一个出租车,有一个起始时刻,起点,终点,行走路程为曼哈顿距离,每辆出租车必须在乘客一分钟之前到达,问最少需要几辆出租车思路:如果一辆车载完一个乘客a,能去载乘客b,就连一条有向边,这样做完整个图形成一个DAG,然后要求的最少数量就是最小路径覆盖,利用二分图最大匹配去做,把每个点拆成两原创 2014-09-03 23:52:03 · 1290 阅读 · 0 评论 -
UVA 11280 - Flying to Fredericton(最短路)
UVA 11280 - Flying to Fredericton题目链接题意:给定一些国家,和两个国家间的花费,现在有一些询问,询问每次最多转k次飞机,最小花费思路:dijkstra变形,多开一维表示转机次数即可代码:#include #include #include #include #include #include #include原创 2014-09-24 23:50:26 · 1294 阅读 · 0 评论 -
UVA 1161 - Objective: Berlin(网络流)
UVA 1161 - Objective: Berlin题目链接题意:给定一些航班,每个航班有人数,和起始终止时间,每次转机要花半小时,问限制时间内最多能有多少人从起始城市到终点城市思路:以航班为结点建图,航班有容量限制所以进行拆点,然后两个航班如果终点和起点对上,并且时间满足就可以建边,然后源点连向起点为起始的航班,终点为终点的航班连向汇点(要在时间不超过时限的情况下),原创 2014-09-26 11:42:42 · 1166 阅读 · 0 评论 -
UVA 1391 - Astronauts(2-SET)
UVA 1391 - Astronauts题目链接题意:给定一些宇航员,年龄小于平均数能做A和C,大于等于能做B和C,现在知道一些宇航员互相憎恨,不能让他们做同一个任务,问一直种安排方法满足条件思路:2set问题,如果两种宇航员类型相同,就两个宇航员做不一样,加一条真或真,和假或假的边,如果类型不同,就加一条真或真的边代码:#include #includ原创 2014-08-30 21:14:24 · 1147 阅读 · 0 评论 -
UVA 1146 - Now or later(2-SET)
UVA 1146 - Now or later题目链接题意:n个飞机,每个飞机有一个早到时间和一个晚到时间,问怎么安排飞机,使得飞机到的间隔的最小值最大思路:二分答案,然后利用2-set去判断,如果两个飞机的两个时刻间隔比这个时刻小,那么就是表示不能同时满足这两个条件,就加一条xi^xj的边进去,然后利用2-SET判定一下代码:#include #includ原创 2014-08-30 15:26:36 · 1008 阅读 · 0 评论