【题目一】Hdu 3926 同构图
【题意】给你2个图,最大度为2.问两个图是否相似
【题解】
本质是并查集,但是细节是在是恶心死人了。。。
1.最大度为2.说明这个图可能有多个连通分量,每个连通分量要么是环,要么是链。
2.然后遍历每个连通分量,记录该连通分量的结点个数,以及该连通分量是环还是链。
3.将第一个图按照结点个数排序(若子结点个数相同,则对链先排序)
4.将第二个图按照步骤三排序
5.比较排序后,2个图是否每个元素都相等。若相等,则相似。
【题目二】Hdu 3234
【题意】给出很多组关系(异或)(点的标号是从0到n-1),然后让你求指定的关系的答案,
若求不出则输出 I don't know.
若输入的关系和之前输入的关系有冲突,则输出 The first i facts are conflicting.
i 表示第几次输入,发生冲突时,后面就不需要继续操作了,只需要输入就行了。
【题解】
a^b = 1 , b^c = 2 , 那么 a^c = 1^2 = 3
一开始想的是,只要2个点不在同一个树上时,我就将它们并进去,用一个数组存他与
父亲节点的异或值(不是根节点),如果给的是一个点的话,我就虚拟一个N号节点,
将他与根节点相连(保存根节点的数值),一个集合里只要知道了一个点的值就能知道这个
集合中每一个点的值。在find函数里面递归的时候就能将每个点压缩,所以可以算出每一个
点和根节点的异或值。但是当我一组关系都不知道的时候,只知道每个点的值,也就是说有很
多个集合,这样就会要虚拟很多个N节点。所以,方法是只建立一个N点,如果这个集合的每一个值都能算出来的话才与N相连。
【题目三】Hdu 2473 并查集+虚父节点
【题意】给定n个点,刚进行两种操作,将两个点合并,以及将一个点孤立,问最后点有几堆
【题解】
删除一个点,只是将该点独立起来,或者说将该点从所在集合中脱离,而所在集合的结构不变,若真的将该点从集合中删去,会带来很多不必要的麻烦,所以,可以反而添加一个虚拟的点代替独立出来的点,这样,用一个数组将每一个点都映射到一个虚拟的点上,之后在虚拟的点上面操作即可。当要独立一个点时,只需将该点映射到另一个原先不存在的点即可。
之后,统计集合个数有俩种方法,一个是根据集合含有的元素的个数,另一个则是统计根节点的个数。
【题目四】Hdu 2586 LCA或者Tarjan
【题意】一个村子里有n个房子,这n个房子用n-1条路连接起来,接下了有m次询问,每次询问两个房子a,b之间的距离是多少。
【题解】很明显的最近公共祖先问题,先建一棵树,然后求出每一点i到树根的距离dis[i],然后每次询问a,b之间的距离=dis[a]+dis[b]-2*dis[LCA(a,b)];
LCA(a,b)即是a,b的最近公共祖先。。
【题目五】Poj 3164 朱刘算法★★
【题意】求最小树形图的总权值。即以固定根为起点,沿给定有向边,可以访问到所有的点,并使所构成的边权值之和最小,求这个最小总权值。
【题解】
① 清除自环,输入的时候判断即可
② 先判断从固定根开始是否可达所有原图中的点。简单搜索加标记位就可以。如果不可就不用说了,肯定没戏。
③ 为除根之外的每个点选定一条最小入边。
(记pre [vi]为该边的起点)
④ 判断这个入边集是否存在有向环,如果不存在,我们很容易证明这个集合就是该图的最小树形图,转⑥,否则接⑤。
(利用prev数组,枚举为检查过的点作为搜索的起点,做类似DFS的操作)
⑤ 消环。设(u,i,w)表示从u到i的权为w的边。设刚才的有向环缩为新结点new。若u位于环上,并设环中指向u的边权是in[u]。那么对于每条从u出发的边(u, i, w),在新图中连接(new, i, w)的边,其中new为新加的人工顶点; 对于每条进入u的边(i, u, w),在新图中建立边(i, new, w-in[u])的边。新图中最小树形图的权加上旧图中被收缩的那个环的权和,就是原图中最小树形图的权。重复③④⑤
⑥ 成功,返回DMST总权值。
补充1:如果无固定根,增加一个节点,连接到所有节点,并且距离一样,即可转化为有固定根。
补充2:本算法只能求最小总权值,但不能求路径。
【题目六】Poj 3164 反向图
【题意】给你一个有向图,一个起点集合,一个终点,求最短路。。。。
【题解】
1.自己多加一个超级源点,把起点集合连接到超级源点上,然后将起点与超级源点的集合的路径长度设为0,这样就称为一个n+1个点的单源最短路算法。。。。。
2.反向图+终点的Dijkstra,然后记录最小值。
【题目七】Hdu 2363
【题意】
小明从家里走到学校去考试, 路上有各个交叉点,它们有自己的海拔高度。 小明从家里走到学校的路上,必然会经过不同的交叉点,因此会不断的走上走下,忐忐忑忑,这让他很不安,会影响他考试的发挥。因此,他要选择一条起伏最小的路去学校。所谓的“起伏最小”,是指这条路上海拔最高的点与海拔最低的点的差值最小。
在起伏最小的前提下,还要求出路程距离最短。
根据高度差的递增,明显满足条件的路径数量也是递增的,因此可以二分“高度差”。光有“高度差”还是不够的,因为“起伏值”等于最大高度减最小高度, 所以需要再枚举最小高度(下限low), 在根据最小高度+“高度差”得到最大高度(上限up), 有了low和up这两个条件,就可以进行求限制最短路。
【题目八】Hdu 2363
【题意】 最短路
【题解】学习一下什么是插点法Floyd
【题目九】Hdu 2289
【题意】一个圆台,里面装了一些水,现在告诉你圆台上下底半径,高度,水的体积,问你水的高度是多少。
【题解】数学题,用到圆台求体积公式,二分法逼近求值。
【题目十】poj 2400
【题意】
有n个Supervisor和Supervisee,他们之间相互有一个评分,现在要求一个匹配,所有人的评分和最小,并输出使评分和最小的所有匹配方案。
【题解】
使用KM算法求二分图的最小权匹配,并用dfs输出所有方案。
【题目】
有若干个人和若干个房子在一个给定网格中,每人走一个都要一定花费,每个房子只能容纳一人,现要求让所有人进入房子,且总花费最小。
【题解】
题目中关键字为:每房子容纳一人,行走有花费,典型的最小费用最大流问题。建图加入超级终点和源点,注意对所有房子和人之间建立边。
【题目十二】Poj 2553
【题目】有向图,设某个点sink,那么由该点可以到达的点也是sink点,判断哪些是sink点?
【题解】缩点为DAG图,出度为0的点就是答案。
【题目十三】Hdu 1878 并查集+欧拉回路
【题目】判断图的欧拉性质。
【题解】判断是否存在欧拉回路,存在欧拉回路的条件:所有顶点的度为偶数,并且图是联通的
判断顶点的度是否为偶数只要进行统计判断就行,判断图的联通可以用并查集,
判断所有的顶点是否在一棵树上只要看有几棵树就可以了。
【题意】有一些蜥蜴在一个迷宫里面,有一个跳跃力表示能跳到多远的柱子,然后每根柱子最多被跳一定次数,求这些蜥蜴还有多少是无论如何都
逃不出来的。
【题解】对每个柱子拆点,容量是可以跳得次数,如果是在边界上则右半点连到汇,容量INF,如果柱子上有蜥蜴就连到源,容量1.直接跑一趟最大流,sum-maxflow就是答案。
【题目十五】Hdu 3879 最大权闭合图
【题解】
源点与人连边,容量为获利。站点与汇点连边,容量为耗资。然后是相应的人与其需求的站点连边,容量为无穷。
这样建图就完成了,然后就是找最小割,即割边上的值便为不能获取的利润值,用总值减去得出最大利润。