
图论
文章平均质量分 55
Crossing over
这个作者很懒,什么都没留下…
展开
-
PAT T1016 Uniqueness of MST(35)
传送门无向图,判断其mst的唯一性,若没有mst则输出连通分量数。结论:只有当原图中存在权值相等的边的情况下,才有可能会造成mst不唯一。还是原来的kruskal算法,但是设置一个两层循环来从小到大遍历边,其中内层循环遍历的都是权值相同的边(神似PAT A1009,在一个有序数列中合并“同类项”。。)使用两个这样的内层循环:前者在上一次外层循环的状态下测试每条边的可用性;(计数变量ed...原创 2019-06-04 23:34:05 · 688 阅读 · 0 评论 -
PAT A1004 Counting Leaves(30)
题意给定家族树(结点总数、非叶节点总数和上下层对应关系),求每层的叶节点数。注意输入数据后从根节点递归得到每个节点的层次。(因为某些测试用例不是严格按照树层次输入的,不这样搞会挂掉一些测试点)单词pedigree 血统,家谱hierarchy 层次fix 固定原创 2017-02-11 01:05:49 · 304 阅读 · 0 评论 -
HDU 2680 Choose the best route
传送门最短路。很简单的一道多起点的求最短路的问题,注意是有向边,会有重边。当然我看到了我自己两年前写的版本是把图倒过来,终点当作起点,起点当作终点,每条边都取反向,从原终点开始dijkstra,然后看看哪个原起点的d最小。。。#include <cstdio>#include <iostream>#include <algorithm>#inclu...原创 2019-03-24 16:57:13 · 124 阅读 · 0 评论 -
HDU 1317 XYZZY
传送门最短路。涉及到了把求最长路转化为求最短路,还有bellman_ford判断负环(可从起点到,也应可到终点的负环)的问题。这道题比较综合。有最多100个房间,其中有一个是起点有一个是终点,每个房间都有一个能量值([-100,100]),单向的门连接两个房间。有一个人从起点出发(自身携带100能量),每到一个房间就获得这个房间的能量(房间的能量不会减少,可以多次获得同一个房间的能量),这个人...原创 2019-03-24 14:08:49 · 237 阅读 · 0 评论 -
HDU 2807 The Shortest Path
传送门最短路。全源最短路,使用floyd。给你很多个矩阵,每个矩阵代表一个点,两点之间有一条有向边(A->C,权值为1)当且仅当A*B=C(矩阵运算),其中A,B,C代表不同的点。然后给很多个查询,每次问你从一个点到另一个点的最短路。主要注意上述A,B,C指代不同的点。矩阵相乘放在第二层循环得出结果,再和第三层枚举的每个矩阵比较。#include <cstdio>#i...原创 2019-03-26 23:35:49 · 178 阅读 · 0 评论 -
HDU 3986 Harry Potter and the Final Battle
传送门这道题和1595基本一样,但是有两个根本不同:这道题明确说了有重边这道题说不一定连通对于第一点,用邻接表就好了,在最短路算法中记录前驱,注意,记录的是前驱的边的索引,然后回溯的时候每次删一条边,体会这个循环的写法 for (int x = N; x != 1; x = ve[pre[x] ^ 1].n)。另外,删边其实还是把边权置为INF,然后最短路算法里要加上判断当前边权不等于...原创 2019-03-30 19:13:35 · 186 阅读 · 0 评论 -
HDU 2112 HDU Today
传送门最短路。很坑的是,这道题没说清楚是不是有向边(其实是无向边),而且还有起点和终点相同的数据。两年前我写的是一个map<string,int>和一个vector<string>来对地名和下标双向关联,但是现在发现没必要了,只用一个map<string,int>用来查重就行了,如果让你输出地名之类的才可能需要双向关联。#include <iostr...原创 2019-03-23 16:54:52 · 127 阅读 · 0 评论 -
HDU 2066 一个人的旅行
传送门最短路,只不过有多个开始点和结束点,选一条从任意开始点到任意结束点最短的路。再额外建立一个虚拟开始点和虚拟结束点即可。#include <iostream>#include <algorithm>#include <vector>#include <cstring>using namespace std;const int I...原创 2019-03-23 16:02:00 · 128 阅读 · 0 评论 -
HDU 1595 find the longest of the shortest
传送门最短路。给一个无向图,随机删去一条边,问你在所有可能的删边情况下的给定两点间的最短路的最大值。想象删的这条边如果不在原最短路上,那么无影响,只有在原最短路上删边才可能会造成最短路的值提升。那么就在原最短路上一条边一条边的枚举好了。这道题说边数M<=N*(N-1)/2,所以可以认为应该没有重边。对这道题而言,有没有重边非常重要,如果有重边,就不能再用邻接矩阵了(因为邻接矩阵默认每...原创 2019-03-30 15:16:07 · 148 阅读 · 0 评论 -
HDU 2224 The shortest path
传送门属于动态规划。TSP(旅行商)问题的简化版本,双调旅行商问题。时间复杂度O(n^2)。可以参考这个。给你平面上n个点的坐标,这些点的x坐标依次增大,让你找一条满足这样的性质的最短的路:从1出发,沿着x增大的方向走到n,再沿着x减小的方向走回1,在这途中除了1以外的每个点都要访问一次且仅一次。这道题完全就是动态规划,只是背景好像最短路一样,其实和最短路算法没任何关系。我们可以这样想,...原创 2019-03-26 17:08:09 · 174 阅读 · 0 评论 -
HDU 2544 最短路
传送门最短路,没有任何变形,还是中文题。#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include <utility>using namespace std;const int INF = 1e9;const in...原创 2019-03-23 13:46:36 · 131 阅读 · 0 评论 -
HDU 1548 A strange lift
传送门最短路。有一个奇怪的电梯,每个楼层有两个数,分别代表从这层坐电梯能往上跑几层或能往下跑几层,层数只在1~N之间生效。问你给定的两层作为出发和到达点,最少坐几次电梯能到。隐含的建图,图上的边的权值是1,代表坐一次电梯,边的两个端点代表两个层,注意是有向边。#include <iostream>#include <algorithm>#include <...原创 2019-03-23 13:36:09 · 142 阅读 · 0 评论 -
HDU 2833 WuKong
传送门求两条最短路最多重叠的点数。给一个无向图,再给两对起点终点,每一对起点终点之间都可能有多条最短的路,设s1和t1的最短路是r1,s2和t2的最短路是r2,求r1和r2最多能相互重叠多少个点。这道题思想很巧妙,涉及了dp的思想。首先想明白一个问题,两条最短路的重叠部分必然是连续的,不可能有两段或更多段分散的重叠部分。为什么?反证法,若有的话,则某两段重叠部分之间的各自的分散部分一定可以都...原创 2019-04-03 22:56:36 · 182 阅读 · 0 评论 -
HDU 2818 Building Block
传送门带权并查集。有N个块,刚开始,每个块自成一堆,下面进行P次操作或查询,操作是指把包含(编号为X的块)的堆整体摞到包含(编号为Y的块)的堆上;查询是指给定某个块编号,问你这个块下面压着几个块。因为在不停变化,这道题需要输入一个查询后立即输出一个结果。有点类似HDU 3635,但不一样。画个图来说,圆点代表某个点,方块点代表某个子树。点右边的数字代表同层中被连接到父节点的次序。cnt[...原创 2019-03-23 01:33:41 · 202 阅读 · 0 评论 -
HDU 1535 Invitation Cards
传送门最短路。这题瞎扯一大堆废话,其实就是一个有向图,先求从1到其他点的最短路,再求从其他点到1的最短路,上述2(n-1)个最短路的值的和作为答案(题目保证是强连通图)。从其他点到1的最短路,我们不可能把其他每个点都作为起点运行一下,肯定会超时的。这就要用到反向建图。在正向图中某个点到1的最短路就相当于在反向图中1到这个点的最短路。(反向建图指的是把边的指向反转,和边权无关,想一想什么时候用...原创 2019-03-29 22:41:28 · 211 阅读 · 0 评论 -
HDU 1142 A Walk Through the Forest
传送门最短路+记忆化搜索。一个无向图,问你从起点到终点有多少条这样的路,该路径包含的边a->b都满足至少存在一条b到终点的路比所有a到终点的路都要短。这道题中path指边,route指路径。这道题比较良心,说了权值都为正。首先这个条件等价于b到终点的最短路小于a到终点的最短路。那么先求所有点到终点的最短路,因为是无向图所以不用反向建边了,直接以终点为源点求最短路。接下来从起点开始df...原创 2019-04-11 00:40:29 · 221 阅读 · 0 评论 -
HDU 1599 find the mincost route
传送门floyd求最小环(正环)问题。注意和HDU 1217的区别。这个题就是套路固定这么做的,这个题和负环完全没有一点关系。是个中文题,题意就没啥可说了,这个题是个无向图,求一个至少有三个点的环,这个环在全图所有至少有三个点的环中长度最小(所谓环的长度就是绕着这个环走一圈,每条边的权值之和)。套路就是在floyd的第一层下面,第二三层上面,再加一个两层循环,用来枚举每两个点i,j,首先保...原创 2019-04-01 20:27:22 · 146 阅读 · 0 评论 -
HDU 1839 Delay Constrained Maximum Capacity Path
传送门二分枚举最短路。我是服了这几个词了,你是真的牛批:unidirectional 单向bidirectional 双向undirected 无向directed 有向和HDU 2363很像,注意体会。给你一个无向图,让你找一个从1到N的最小找最大(每条路上最小的边权(cap),所有路上取其最大值),然后还必须这条路的另外一个边权(time)之和小于等于一个常数T。就像上面...原创 2019-04-01 22:49:23 · 247 阅读 · 0 评论 -
关于判定4种无向图的一些想法
回顾了这几道题之后,写一些总结。HDU 1198(求解 无向图 有几个 连通分量)HDU 1272(判断 无向图 是不是 无环连通图)HDU 1325(判断 有向图 是不是 树)下面是无向图的四种情况:无环连通图有环连通图无环非连通图(每一个连通分量都是无环的)有环非连通图(至少有一个连通分量是有环的)边数 = 点数 - 1边数 > 点数 - 1边数...原创 2019-05-10 02:28:54 · 592 阅读 · 0 评论 -
HDU 3832 Earth Hour
传送门三点连通。给你一个平面,上面有很多个点,给你每个点的坐标,每个点还有个半径,两个点之间有一条无向边当且仅当以两点为圆心的两圆相切或相交。在给定的三个关键点之间互相连通的基础上,问你最多拿走多少个点(拿走的这些点相当于不存在了,完全不参与那三个关键点的连通)。毫无疑问,这题首先我们得建边,比较两圆心的距离和半径之和即可。然后这个无向图就出来了。然后考虑一下,这题问的是最多拿走多少点,那相...原创 2019-04-14 22:11:29 · 285 阅读 · 0 评论 -
HDU 3631 Shortest Path
传送门floyd插点。(看起来难实际很简单)给你一个有向多重图(就是可能会有重边和自环,对应简单图),会标记一些点,然后再询问给定两点的最短路,要求该最短路上经过的点都是被标记过的(必然包括起点终点)。权值都为正,看样例,发现当起点终点相同时最短路必然是0(当然这个点得标记过才行)。其实这题就是把floyd的第一层循环k拆成在线处理了,你给一个标记点,然后我就运行一遍以这个标记点为k值的2/...原创 2019-04-13 23:00:43 · 225 阅读 · 0 评论 -
HDU 3768 Shopping
传送门dfs回溯搜索。(哈密顿回路)给一个无向图,给定起点,再给几个商店(最多10个),要求找一条从起点出发、经过所有商店、再回到起点的最短路。因为商店数量很少,肯定是搜索了。可以用dfs,也可以用状压dp?(不太懂,没试,像这个一样?)需要先最短路预处理一下,因为只会用到起点和这些商店之间的最短路,所以先把这些关键点的下标映射到一个数组,然后以每个关键点为源点来一遍最短路。然后就是写这...原创 2019-04-13 21:46:45 · 207 阅读 · 0 评论 -
HDU 4114 Disney's FastPass
传送门状压dp+最短路。一个无向图,接下来给出一些兴趣点,每个兴趣点被访问时有一定耗时。找一条从起点开始访问所有兴趣点再回到起点耗时最短的路(必须访问所有兴趣点,途中可以经过任意点(经过任意点包括兴趣点都不耗时))。每个兴趣点在一些点有通票,经过这些点中任意一个就可以拿到这个兴趣点的通票,拿到通票之后意味着访问这个兴趣点的耗时可以缩短。题意比较复杂,给定的兴趣点的最大值是8。我们可以考虑用二...原创 2019-04-10 02:23:50 · 267 阅读 · 0 评论 -
HDU 3191 How Many Paths Are There
传送门次短路条数。一个有向图,给定起点终点,问你次短路条数,保证有次短路,保证没有环路。按理说这道题没什么可说的,但是,这道题有一个很大的坑,就是会有权值为零的边。这是我看了这道题的Discuss才知道的,感谢。求条数的问题对零环敏感,这我们知道,但是这道题说了保证没有环路,所以本来不用担心。但是,求条数对零边也敏感(不管你是求最短路条数还是第k短路条数)。为什么?问题出在else if...原创 2019-04-09 20:08:45 · 196 阅读 · 0 评论 -
HDU 3339 In Action
传送门01背包。预先求解一下最短路+求至少装一半以上(不包含一半)的最小价值。给你一个无向图,每件物品的价值是起点到这个点的最短路值,每个物品的重量是这个点的能量值,注意,这道题所说的是坦克一直停在那个点才占有那个点的能量值,不是一辆坦克走一圈。。。所以这就好办多了,直接用背包了。这道题要求至少装一半以上,这个我们先按照恰好装满来求解,然后枚举每个容量>= V/2+1的背包值然后取最小...原创 2019-04-12 23:03:17 · 112 阅读 · 0 评论 -
关于二分限制最短路的题的总结
下面几道题分为两类:最小找最大(还加了一些限制):HDU 2962,HDU 1839最大找最小:CCF CSP 201703 4.地铁修建路上的边权极值相差最小:HDU 1598路上的点权极值相差最小:HDU 2363这几道题都可以用二分限制最短路来求解,但不是都能用并查集来求解。需要输出最短路值(限制情况下),或者对最短路值有个上界,或者有向图,这些情况就都不能用并查集了。(使用并...原创 2019-04-12 21:06:25 · 251 阅读 · 0 评论 -
HDU 2377 Bus Pass
传送门最短路。这个图的边通过给定每个点的邻接点的方式给出,每条边都默认权值是1,且是无向的。然后再给出一些公交路线,把这些公交路线包含的所有点组成一个集合(是全图的点集的子集),要求在全图中找一个点,使得这个点到这个集合的距离最小(若相等则输出id最小的点)。点到集合的距离定义为这个点到这个集合中所有点的最短路的最大值。最小找最大再找最小,我们可以先看前两个步骤。我们现在需要求每个点到这个集...原创 2019-04-03 17:42:52 · 180 阅读 · 0 评论 -
HDU 1688 Sightseeing
传送门求次短路。给一个有向图,给定起点终点,求最短路条数和只比最短路的值大1的路径的条数之和。这道题就是用普通的次短路求解就行了,求出来的次短路如果正好比最短路大1,那么就存在这道题中所谓的“大1次短路”;如果不是则就没有。这道题比较人性化,说了几个关键信息。没有自边(自环),每条边的权值都是正数,可能有重边。权值都是正数意味着没有零环和负环,因为有零环意味着求不出最短次短路径条数(或者在...原创 2019-04-08 21:37:36 · 223 阅读 · 0 评论 -
HDU 1596 find the safest road
传送门[0,1]区间乘积最长路。和这个类似,不过这道题没有大于1的边,所以没有“负环”(在一个环上走不会越来越大)。这道题已经给了邻接矩阵(所以连初始化都不用了),按有向图算,不连通的边都给了0。所以最后查询的时候还是0就意味着不连通。这道题用不着考虑floyd里面那三个相不相等。#include <cstdio>#include <iostream>#inc...原创 2019-04-11 22:48:43 · 122 阅读 · 0 评论 -
HDU 2962 Trucking
传送门二分枚举最短路。和HDU 1839几乎完全一样。都是先最小找最大(边权cap),然后再求最短路(边权len),无向图。这道题说的什么高度和运量是一个意思。限制高度就是限制运量,最大化运量就是最大化高度。不同就是这道题不限制最短路上限,而是对最大运量加了一个上限L。这道题的二分数组是[L...0],直接存的就是最大值到最小值的连续区间。与另一种做法:存每条边的容量再从大到小排序再去除大于...原创 2019-04-02 21:00:06 · 219 阅读 · 0 评论 -
HDU 3873 Invade the Mars
传送门带限制最短路。一个有向图,给定起点终点,求结点依赖关系下的最短路。所谓结点依赖,是指每个结点i都依赖于零个或多个其他结点,结点i可访问当且仅当它依赖的这些结点都已经访问过。(可以确定的是,起点肯定不依赖于任何点,而且每个点都不可能依赖于自身)这道题(只能? )用dijkstra完成,dijkstra最短路算法可以保证每次大循环找到的u点不重复(因为有vis[]数组控制着),每个点最多只...原创 2019-04-02 19:56:57 · 253 阅读 · 0 评论 -
HDU 1217 Arbitrage
添加链接描述最短路判环问题。货币交换,通过其他货币汇率相乘最后绕回自己可能会多赚一点。问你能不能多赚。首先,这道题需要判定有没有这样的环(这个环每个边的乘积大于1.0),而且是全图判定,没有什么起点终点。想到大于我们可以知道,这道题需要求最长路,而且是乘积最长路,而且是全源求解。全源求解就用floyd,这个算法就运行那么三层循环,却可以保证检查出所有的整体符合上述优化规则的环(或者这么说,...原创 2019-03-29 02:08:35 · 203 阅读 · 0 评论 -
关于强连通图和欧拉图的一些粗浅理解
由于上一道题涉及了环,所以我当时就在纠结一个问题,强连通图是否一定可以是环形的?(就是说强连通图是否一定是欧拉图?= 是否一定有欧拉回路?= 是否一定有一笔画的环形路线?)现在,我给出答案,不一定。下面所说的欧拉路径不包含欧拉回路。下面几点都是关于有向图。强连通图不一定是欧拉图。反例如下:(但是这个强连通图有欧拉路径)连通的欧拉图一定是强连通图。(想想孤立点?2333)一个有向图是欧...原创 2019-03-29 18:47:24 · 6150 阅读 · 0 评论 -
HDU 2883 kebab
传送门有N个顾客,每个顾客需要一些烤串,每个烤串的制作时间不同(一个顾客内是相同的),每个顾客有一个开始时间和截止时间,在小于等于截止时间的时候完成。这个老板可以最多同时烤M串,可以把一个串分为多个不连续的时间段来烤,甚至可以把一个串分为多个部分(根据时间划分)来同时烤(占用多个位置,子串的烧烤时间和分量成正比)。其实就是有N个任务,每个任务有ni*ti个单位,这些单位随便任意组合(上述那些奇...原创 2019-03-18 22:41:00 · 191 阅读 · 0 评论 -
HDU 3605 Escape
传送门有N个人,M个星球,有一个N*M的矩阵,表示某个人是否可以去某个星球。问你这些人能不能全安排到这些星球上?做过了之前的几道题,这道题明显就是网络流了,但是,这道题考了缩点/状态压缩,因为N取值上限太大了,每个人都建一个点会超内存的,考虑M的上限很小(10),对所有人而言,去星球的状态最多2^M = 1<<M种,所以每种状态建一个点就好了(每种状态代表一类人,这类人完全等价)。...原创 2019-03-21 23:17:29 · 186 阅读 · 0 评论 -
HDU 1811 Rank of Tetris
传送门给定点之间的关系,让你判断序列是否唯一或者非法。 注意的是 点之间相等的话总是可以根据另一种关系排序,所以如果某些点相等的话就不用考虑他们之间的关系了(他们之间的排序是唯一且固定的),而且他们在总排序上是连续的。 所以相等的一些点可以看成一个连通分量,采取“缩点”的思想,他们可以由其中的一个点代表。 所以问题就是,怎么判断有环(也是非法的一种),怎么判断不唯一,怎么判断“绝对非法”(就是原创 2017-04-09 23:18:57 · 220 阅读 · 0 评论 -
HDU 1598 find the most comfortable road
传送门这题不会,记住写法就行了,好像都是这么写的? 第一次从最小边开始往上添,第二次从第二小边开始。。。每次添边直到那俩点连通,每次记录该次的极差并更新最优值。 可得到的结论是,第i+1次添的最后一条边肯定不会比第i次添的最后一条边权值还小。#include <iostream>#include <algorithm>#include <vector>#include <cstring>原创 2017-04-08 21:46:24 · 241 阅读 · 0 评论 -
HDU 1102 Constructing Roads
传送门3371的弱化版,怎么都能过。#include <iostream>#include <algorithm>#include <vector>#include <cstring>using namespace std;const int MAXN = 1e2 + 3;const int INF = 1e9;int dis[MAXN][MAXN];int N, Q;int d[M原创 2017-04-08 21:34:16 · 175 阅读 · 0 评论 -
HDU 1856 More is better
传送门找最大连通分量,没有一对pairs就输出1。#include <iostream>#include <algorithm>#include <vector>#include <cstring>using namespace std;const int MAXN = 1e7 + 2;int pre[MAXN];int pairs;int opt;int f(int x){原创 2017-04-08 21:25:53 · 212 阅读 · 0 评论 -
HDU 1325 Is It A Tree?
传送门这个题是判断是否为树。 树的边是有向的,树也可以为空。 代码里面,s指子结点集,total指结点集,v指边集。 还有一个坑,最后结束标志是负数而不一定-1?#include <iostream>#include <algorithm>#include <vector>#include <cstring>#include <unordered_set>using namespac原创 2017-04-08 20:19:18 · 281 阅读 · 0 评论