刷题之前来几套LCA的末班
对于题目
HDU 2586 How far away
2份在线模板第一份倍增,倍增还是比较好理解的
#include
View Code
第二份DFS+ST+rmq。关于这种算法的解释在代码里有个链接
#include
View Code
HDU 1269 迷宫城堡
裸题+中文题!
#include
View Code
POJ 2767 Proving Equivalences
强联通推证明题 缩点后统计入度出度为0的点。具体答案是max(cntdegout = 0,cntdegin = 0)。很水直接看代码
#include
View Code
HDU 3836 Equivalent Sets
与上题一样
#include
View Code
HDU 1827 Summer Holiday
强连通缩点,统计入度为0的就是要通知的人,对于每一个强连通分量只需要通知里面代价最小的那个更新答案即可。水题
#include
View Code
HDU 3072 Intelligence System
给了一个含有 n(0
问,从给定的节点向其他所有的点通信,所花费的最小代价是多少
先对原图缩点,形成一个 DAG,给的那个定点显然是 DAG 中入度为 0 的点,并且入度为 0 的点肯定只有一个(根据题目的意思)
每个顶点(除了那个定点)必定只有一个入点,那么,对于每个顶点,完全可以选择代价最小的那条入点,贪心的找即可
做了好久忘了咋做的了。上面你的题解是复制的。解法是一样的具体看代码。
#include
View Code
HDU 3639 Hawk-and-Chicken
有 n(2<=n<=5000) 个人,m(0
需要注意的是 support 是可以传递的,比如:A support B && B support C,那么,C 得到的 support 是 2
做法:强连通缩点,出度为0的点就是我们要的可能的最大support。为什么代码里是入度,我记得要处理出这个连通分量里的点是什么。而正向处理是比较麻烦的。
所以变成建反图,从入度为0点处理
#include
View Code
HDU 3594 Cactus
仙人掌图+tarjan
我看了别人的题解弄的。代码里有解释和别人的题解链接
/*
题目大意:给你一个图,让你判断他是不是仙人掌图。
仙人掌图的条件是:
1、是强连通图。
2、每条边在仙人掌图中只属于一个强连通分量。
仙人掌图介绍 --> http://files.cnblogs.com/ambition/cactus_solution.pdf
解题思路:
1、首先得先熟练掌握塔尖tarjan算法的应用。
2、必须了解仙人掌图的三个性质:
(1).仙人掌dfs图中不能有横向边,简单的理解为每个点只能出现在一个强联通分量中。
(2).low[v]*/
#include
View Code
HDU 2242 考研路茫茫――空调教室
枚举桥然后处理处每个点孩子的总数直接做就行
#include
View Code
HDU 2460 Network
a数组记得是表示以该点为桥边的较深点的桥是否已经被删除过
#include
View Code
HDU 3849 By Recognizing These Guys, We Find Social Networks Useful
读完提就会做。
#include
View Code
HDU 3896 Greatest TC
搜了题解做的。代码里有我搜的题解的解析。太弱了orz
/*
给出一个无向图,询问两个点在删去一条边或者一个点以后能否到达。
生成一颗dfs树,然后记录dfn[]、low[]、final[]、deep[]。Final表示离开这个节点的时间。
对于边的询问,询问的节点是a,b,设这个边为g1-g2,其中deep[g1]>deep[g2]。
1. a在g1的子树内,b也在g1的子树内,那么a、b可以到达。
2. a不在g1的子树内,b也不在g1的子树内,那么a、b可以到达。
3. 不妨假设a在g1的子树内,b不在g1的子树内,则判断low[g1]是否≤dfn[g2]。如果是的话,那么a、b可以到达。
4. 其他情况下不能到达。
对于点的询问,询问的节点是a,b,设这个点为g1:
1. 如果a,b都不在g1的子树内。则可行
2. 如果a,b有一个在g1的子树内(设为a),求出在a-g1路径上的倒数第二个点k,如果low[k] < dfn[g1]则可行
3. 如果a,b都在g1的子树内。求出在a-g1路径上的倒数第二个点k1,在b-g1路径上的倒数第二个点k2,判断是否两者的low都= dfn[g] 且 final[a] <= final[g]
开始怎么都a不了。后然问了学长才发现对于点询问如果a,b,都在g1子树中,如果k1=k2那么直接输出yes好了。。wa了N多次。。
*/
#include
View Code
HDU 4005 The war
比较难的题目。所点后从最小桥边两个点为起点DFS,找到次小值为答案
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
View Code
HDU 3394 Railway
做了这么多题这是第一道点连通分量的题目。可以的。。一直WA以为是边联通就对。。(⊙﹏⊙)b
注意割点可以属于多个双连通分量
//注意这里是点双联通而且又一个重要的。不可以直接TARJAN后处理Belong然后在处理多余边。一定不可以
//一定要在TARJAN处理处一个联通快就直接更新答案、原因就是这里的是点双联通
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
View Code
HDU 2874 Connections between cities
倍增无难度
#include
View Code
HDU 3078 Network
直接暴力居然不会T。我也不知道为啥。
所以做法就是直接爆。修改就直接该。Nothing more
#include
View Code
HDU 3830 Checkers
这题真的神。我醉了。完全抄的比人的代码。感觉如果比赛除了这题必然不会。。膜拜一下
题解看这里讲的非常详细
http://www.cnblogs.com/scau20110726/archive/2013/06/14/3135024.html
#include
View Code
HDU 4338 Simple Path
很考验玛丽的一道题、具体怎么做的不太好说。看这里吧。他说的比较好。
就是通过割点。点双连通分量建树,然后树上的关系更新出答案,去重。割点要单独为1个点。
如果查询的点就是割点要选择单独割点为新点的那个店作为新图 。其余情况选择点双连通分量的那个店
这个非常详细 http://blog.csdn.net/julyana_lin/article/details/8128352
代码如下。有些中间调试没删掉。感觉此题比较考验玛丽。仔细看一下发现其实还是很容易些的,多一份写法可能更相似更愿意去看。
#pragma comment(linker, "/STACK:102400000,102400000")
#include
View Code
FZU 1719 Spy network
在缩点入度为0的点里选择权最小的求和就是答案。比较容易
#include
View Code