20160321_F_第三周

来源:互联网 发布:mac桌面快捷键 编辑:程序博客网 时间:2024/06/10 06:51

【题目一】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 2195

【题目】

        有若干个人和若干个房子在一个给定网格中,每人走一个都要一定花费,每个房子只能容纳一人,现要求让所有人进入房子,且总花费最小。
【题解】

         题目中关键字为:每房子容纳一人,行走有花费,典型的最小费用最大流问题。建图加入超级终点和源点,注意对所有房子和人之间建立边。


【题目十二】Poj 2553

【题目】有向图,设某个点sink,那么由该点可以到达的点也是sink点,判断哪些是sink点?

【题解】缩点为DAG图,出度为0的点就是答案。


【题目十三】Hdu 1878 并查集+欧拉回路

【题目】判断图的欧拉性质。

【题解】判断是否存在欧拉回路,存在欧拉回路的条件:所有顶点的度为偶数,并且图是联通的
判断顶点的度是否为偶数只要进行统计判断就行,判断图的联通可以用并查集,

判断所有的顶点是否在一棵树上只要看有几棵树就可以了。


【题目十四】Hdu 2732  拆点+最大流

【题意】有一些蜥蜴在一个迷宫里面,有一个跳跃力表示能跳到多远的柱子,然后每根柱子最多被跳一定次数,求这些蜥蜴还有多少是无论如何都

逃不出来的。

【题解】对每个柱子拆点,容量是可以跳得次数,如果是在边界上则右半点连到汇,容量INF,如果柱子上有蜥蜴就连到源,容量1.直接跑一趟最大流,sum-maxflow就是答案。


【题目十五】Hdu 3879 最大权闭合图

【题目】一个公司打算建n个基站,每个基站有一个花费。给定一些条件,假如i,j两个基站都建立了,那么可以获得x的收益,问如何建立基站可以使得总获利最大。

【题解】

源点与人连边,容量为获利。站点与汇点连边,容量为耗资。然后是相应的人与其需求的站点连边,容量为无穷。

这样建图就完成了,然后就是找最小割,即割边上的值便为不能获取的利润值,用总值减去得出最大利润。


0 0