---------图论---------
Icefox_zhx
这个作者很懒,什么都没留下…
展开
-
bzoj1715 [Usaco2006 Dec]Wormholes 虫洞(spfa判负环)
spfa判负环,写的dfs版,听说更快些。注意d数组这回要清成0,可以更快。如果一个点在一条最短路径上出现了两次,则一定存在负环。原创 2017-09-13 15:03:59 · 470 阅读 · 0 评论 -
bzoj3408 [Usaco2009 Oct]Heat Wave 热浪(Dijkstra裸题)
Dijstra裸题。原创 2017-09-06 08:30:43 · 476 阅读 · 0 评论 -
bzoj2346 [Baltic 2011]Lamp(建图spfa)
对角线建边,以前有的边权为0,没有的边权为1,跑最短路。原创 2017-09-13 20:21:44 · 243 阅读 · 0 评论 -
luogu1262 间谍网络(tarjan缩点)
tarjan缩点,就是用来把一个有向带环图变成DAG即 Directed Acyclic Graph有向无环图的算法,复杂度为O(E+V)。dfn[i]是dfs序,low[i]是i及i的子树中最小的dfn。belong[x]是点x在新图中所属的点。原创 2017-09-13 21:30:11 · 135 阅读 · 0 评论 -
bzoj2015 [Usaco2010 Feb]Chocolate Giving(最短路裸题)
把1当作源点,答案就是d[x]+d[y]。原创 2017-09-06 10:07:41 · 453 阅读 · 0 评论 -
luogu1073 【noip2009提高】最优贸易(spfa)
首先最大差价,一定是1到i点路径上的最小值与i到n路径上的最大值的差值。怎么求1到i路径上的最小值呢?利用spfa求出1到各点的路径上最小值即可。那i到n呢?我们把所有边都反向了,重新建图,以n为源点跑spfa,更新最大值。这样还顺便检验了1到i到n的连通性原创 2017-09-06 14:36:48 · 461 阅读 · 0 评论 -
bzoj1051 [HAOI2006]受欢迎的牛(tarjan求强连通分量)
显然,一个强连通内的每头牛都互相欣赏,如果一个强连通内的牛欣赏牛a,则这个强连通内所有的牛都欣赏牛a,因此我们把这些牛都缩成一个点,重新建图,如果只有一个出度为0的点,说明其他强连通都能到这个强连通,输出这个强连通的大小就是答案。如果有多个出度为0的点,说明总会有牛彼此不欣赏,输出0.原创 2017-09-14 09:04:04 · 357 阅读 · 0 评论 -
CF427C Checkposts(tarjan求强连通)
每个强连通分量记最小值,及最小值的个数。原创 2017-09-14 09:42:50 · 562 阅读 · 0 评论 -
luogu1983【2013普及】车站分级(拓扑排序)
每一趟列车,没停靠的站的分级一定比停靠了的小,我们从停靠的站向没停靠的站建一条有向边,显然是个DAG,我们进行拓扑排序,看分成几个阶段(把栈内所有上次的点都删掉算一次。)。就是答案。原创 2017-09-14 13:49:13 · 519 阅读 · 0 评论 -
vijos1404 遭遇战(建图spfa)
这回要自己建图了。。首先为了能连上,我们把[1,3]这种区间改记成[1,4)。在图上用一条1指向4的有向边代替,边权为cost。然后为了解决覆盖的问题,即[1,3],[2,5]这种也可以满足[1,5],我们再建t-s+1条由i指向i-1的有向边,边权为0.这样的话把边再优化一下,让[si,ti+1)建成max(si,s)->min(ti+1,t).然后以s为源点跑最短路即可。原创 2017-09-06 22:37:24 · 344 阅读 · 0 评论 -
poj1062 [ZJOI2002]昂贵的聘礼(spfa+枚举)
思路见神犇http://gisyhy.blog.163.com/blog/static/12939034320099883715624/ 这题比较麻烦的地方在于等级限制,让我们很不好下手,突破口:1一定在最短路上,所以区间最大为[lev[1]-m,lev[1]+m],但是这样还不满足每两个点的等级之差均在m以内,因此我们枚举[lev[1]-m,lev[1] ],[lev[1]-m+1,lev[1]原创 2017-09-07 13:08:49 · 280 阅读 · 0 评论 -
CF516B Drazil and Tiles(拓扑排序)
预处理出每个 . 邻近的 . 有多少个,即有几种方法覆盖这个 . 。然后用类似拓扑排序的方法,每次把只有一种方法覆盖的点覆盖,并更新临近的点。如果最后还剩下了 . ,说明无法完全覆盖,或者方案不止一个。原创 2017-09-15 10:14:52 · 1155 阅读 · 0 评论 -
bzoj2208 [Jsoi2010]连通数(tarjan缩点+拓扑排序+bitset传递闭包)
首先用tarjan缩点,重建图,变成DAG,然后拓扑排序+bitset传递闭包。原创 2017-09-15 11:07:03 · 435 阅读 · 0 评论 -
bzoj1726 [Usaco2006 Nov]Roadblocks第二短路(spfa)
跟最短路差不多,求次短路就要再记录一个d2数组,表示源点到i的次短距离。分类讨论维护即可。原创 2017-09-07 14:55:25 · 529 阅读 · 0 评论 -
bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线(spfa+二分答案)
这题思路真是太棒了。。。二分答案,判断x是否可行时,把原来的各边权按照与x的大小关系变成0或1,(因为如果大于x了,就需要免费掉,否则可以不管),求最短路即可。如果d[n]<=k即可行。 hzwer的题解好像更清晰些: 二分答案,在判定是否可行时,只需要判断是否能寻找到一条路径,使得该路径上大于我们二分的这个值的边不超过k条,实质上就是最短路做的一个变形而已,小于二分的值的边可以看做边权为0,大原创 2017-09-07 14:59:42 · 376 阅读 · 0 评论 -
bzoj3245 最快路线(二维?spfa)
只记到每个点的最小时间显然是不行的。我们还需要知道到这个点的速度是多少。因此我们用d[i][j]表示到i,速度为j的最小时间。最后因为要输出路径,所以我们再记录一个from数组,表示d[i][j]取到最小值的前一条边是谁。最后输出时,递归输出即可。原创 2017-09-07 16:12:00 · 434 阅读 · 0 评论 -
bzoj1589 [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果(tarjan缩点+记忆化搜索)
先tarjan缩点,然后记忆化搜索。。每个点就一个出度,重建图后一个强连通若是大于1则不可能有出度。原创 2017-09-15 11:38:56 · 358 阅读 · 0 评论 -
bzoj1179 [Apio2009]Atm(tarjan缩点+spfa)
tarjan缩点之后不会有正权圈,跑spfa即可。原创 2017-09-15 13:16:42 · 348 阅读 · 0 评论 -
luogu3388 tarjan求割点板子
讲得不错:传送门 byvoid真乃神人也。 大体就是看dfs搜索树,如果x是割点的话,无非两种情况: 1.x是根,且有两棵及以上的子树。x一去掉,它的每个子树就会自成一块。所以x是割点。 2.x是非根非叶子节点,若其子树的节点均没有指向x的祖先节点的回边,说明删除x之后,根结点与x的子树的节点不再连通;则节点x为割点。原创 2017-09-15 14:44:23 · 328 阅读 · 0 评论 -
bzoj1123 [POI2008]BLO(tarjan求割点)
把某个割点去掉以后,会出现几个连通块,它们之间不能互相到达即会分成上面一棵树,下面若干子树子树之间不互通,所有子树和上面那个树不互通,通过记录树的大小统计答案另外删去的点和其它点不互通。来自hzwer的题解原创 2017-09-15 15:07:36 · 373 阅读 · 0 评论 -
bzoj2763 [JLOI2011]飞行路线(分层图最短路)
d[i][j]表示到i点,用了j次免费的最短路,每个j对应了一层。因此唤做分层图。更新时,本层自然要做,还可以跨维度的把下一层也影响了。不过我跑得好慢。。。看各位神犇都是1S以内的。原创 2017-09-07 20:40:50 · 781 阅读 · 0 评论 -
bzoj4992 [Usaco2017 Feb]Why Did the Cow Cross the Road(分层图最短路)
把每个点拆成三个点,分别表示走了%3余0步到i,记作3*i+0,走了%3余1步到i,记作3 *i+1,走了%3余2步到i,记作3 *i+2。每个点i可以向上下左右走一步到达j点,所以对于i,j我们建三条有向边,从 3*i走到3*j+1,边权为t,从3*i+1走到3*j+2,边权为t,从3*i+2走到3*j,边权为t+a[j] (第三步有附加值)。然后以3为源点跑一遍spfa即可。最后答案就是3*n*原创 2017-09-07 17:14:00 · 808 阅读 · 0 评论 -
bzoj1579 [Usaco2009 Feb]Revamping Trails 道路升级(分层图最短路)
根bzoj2763一模一样。原创 2017-09-08 07:44:08 · 507 阅读 · 0 评论 -
poj2631 Roads in the North(求树的直径裸题)
两遍bfs求树的直径(就是树上的最长链) 这里给出树的直径的证明: 主要是利用了反证法: 假设 s-t这条路径为树的直径,或者称为树上的最长路 现有结论,从任意一点u出发搜到的最远的点一定是s、t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两遍广搜就可以找出树的最长路。 证明: 1.设u为s-t路径上的一点,结论显然成立,否则设搜到的最远点为T则 d原创 2017-09-17 16:30:36 · 400 阅读 · 0 评论 -
poj2374 Fence Obstacle Course(线段树+建图spfa)
从上往下看,每条栅栏只有左右端点有意义,而且从每个点出发只会在一条栅栏处停下,所以每个点最多连两条边。我们可以用线段树维护这个连边操作。(每个点只有第一次被覆盖时连边,然后每次把两个端点加进去)然后从s点再连一下,最后剩的都再和终点连一下,然后跑最短路即可。原创 2017-09-17 20:59:21 · 354 阅读 · 0 评论 -
bzoj1232 [Usaco2008Nov]安慰奶牛cheer(kruskal)
对树dfs的性质是,遍历过程中每条边会被访问两次,点访问次数为度数,起点再多一次。 于是我们把遍历的过程每条边分开考虑。 每一条边对答案的贡献为边权*2+两点的点权。 按新权求一棵最小生成树再加上最小点权(作为起点访问)即可。原创 2017-09-26 13:30:01 · 323 阅读 · 0 评论 -
bzoj3390 [Usaco2004 Dec]Bad Cowtractors牛的报复(最大生成树)
最大生成树,和最小基本一样。原创 2017-09-26 13:59:51 · 349 阅读 · 0 评论 -
poj1236 Network of Schools(tarjan缩点)
强连通缩点重构图,入度为0的点的个数即为第一问的答案,第二问的答案为入度为0的点的个数和出度为0的点的个数的最大值。证明见百度。原创 2017-09-18 16:04:04 · 485 阅读 · 0 评论 -
bzoj2438 [中山市选2011]杀人游戏(tarjan缩点)
知道谁是杀手相当于知道所有人的身份。因此题目的答案即在有向图中选择最少的点,使得能遍历到至少n-1个点(最后一个点可以推理得到)。设结果为x,则答案为(n-x)/n。 tarjan求强连通缩点,每个强连通我们只需询问一个人即可。而且只询问那些入度为0的即可。特殊情况是有可能存在一个强连通大小为1,入度为0,且它是不必要的(也就是他指向的点的入度都大于1,即使不问他,也可以遍历到那些点),那我们可以原创 2017-09-18 17:05:16 · 513 阅读 · 0 评论 -
bzoj1977 [BeiJing2010]次小生成树 Tree(kruskal+树上倍增)
先求出最小生成树,注意要严格次小。。。 枚举每一条非树边,把他加进来然后删掉这条非树边连接的两点在树上原来的路径上的最大边(保证是次小),(如果最大边与非树边边权相同则找次大边,为了严格次小)然后更新最小增量。 最大边和次大边可以通过树上倍增求出原创 2017-09-26 20:21:37 · 361 阅读 · 0 评论 -
poj1556 The Doors(建图spfa+判断线段交)
我们把起点和终点,还有所有的线段端点连起来跑最短路即可。两点之间连线段时要判断是否合法,即是否与之间的墙相交。怎么判断呢,直接算斜率什么的会有很大的误差,还可能出现除0的情况很讨厌,因此百度一下向量叉积判断线段相交。看得我都晕了。嗯。下次看到大概还是不会。原创 2017-09-26 21:38:55 · 383 阅读 · 0 评论 -
bzoj1924 [Sdoi2010]所驼门王的宝藏(tarjan缩点+拓扑排序+dp)
把每个点向它能到达的点连一条有向边,那么答案就是这个图的最长链。然后就是一个强连通分量缩点+拓扑排序dp求最长路的套路了。但是,边不能直接暴力连!比如 同一行可能会有好多横天门,然后 就爆掉了!!!其实如果一行有许多横天门,我们不需要对每个横天门都连许多边,因为同一行的横天门肯定是属于同一个强连通的,反正我们也要给他们缩点,所以我们只拿一个横天门出来做,让他去连边,对于同一行的横天门连双向边,其他门原创 2017-09-19 13:18:27 · 572 阅读 · 0 评论 -
bzoj1016 [JSOI2008]最小生成树计数(kruskal+dfs+乘法原理)
首先需要一个结论,对于一个图的不同最小生成树,每种方案所包含的每种权值的边的数量一定一致。换句话说,把每种方案包含的所有边的边权都写下来,写出来的序列一定都一样。关于这个结论的说明放在最后。 这样的话,可以先做一遍kruskal,记下每种边权的使用次数,然后对于每种边权进行dfs,判断有多少种合法的组合方式【一种方案合法意味着:1.加入每条边时,边的两端点一定属于不同的并查集,也就是仍然要符合k原创 2017-09-27 22:46:04 · 341 阅读 · 0 评论 -
bzoj1631 [Usaco2007 Feb]Cow Party(Dijkstra)
心情烦躁只好刷水题。。。正反两遍最短路即可。。原创 2017-09-11 21:35:57 · 720 阅读 · 0 评论 -
bzoj2429 [HAOI2006]聪明的猴子(prim)
就是求最大边最小,就是最小生成树,prim应该更快些原创 2017-09-28 08:34:20 · 349 阅读 · 0 评论 -
bzoj1626 [Usaco2007 Dec]Building Roads 修建道路(kruskal裸题)
kruskal裸题原创 2017-09-28 08:58:12 · 624 阅读 · 0 评论 -
bzoj1682 [Usaco2005 Mar]Out of Hay 干草危机(kruskal裸题)
最大边最小,就是最小生成树裸题原创 2017-09-28 09:12:14 · 451 阅读 · 0 评论 -
bzoj3714 [PA2014]Kuglarz(贪心+并查集)
显然如果要知道所有球的位置,需要知道所有的前缀和的奇偶性。而我们知道了x到y的奇偶性,就是知道了sum[y]-sum[x-1]的奇偶性,我们可以贪心的每次把花费最小的一次询问问了,然后把知道的两个sum合并到一个集合,就像建最小生成树那样。原创 2017-09-28 10:00:10 · 573 阅读 · 0 评论 -
bzoj1624 [Usaco2008 Open] Clear And Present Danger 寻宝之路(Floyd裸题)
Floyd求多源最短路,核心思想就是枚举中转点k,更新d[i][j]。每次循环表示只用前k个点中转,有点dp的味道。复杂度O(n3)O(n^3原创 2017-09-12 07:33:08 · 382 阅读 · 0 评论 -
bzoj1641 [Usaco2007 Nov]Cow Hurdles 奶牛跨栏(Floyd)
Floyd裸题原创 2017-09-12 09:10:43 · 370 阅读 · 0 评论