HS BDC

题意很简单,就是串单词,如果一个单词的尾字母和另一个单词的首字母相同,则可以连接起来,给你N个单词,问:能否串成一条链?

关键在于如何建图,这题稍有不同,就是有些单词是可以翻转的,但也只能用一次而已。把二十六个字母'a'到'z'作为点,把每个单词作为边,如果某个单词首尾字母分别为a和b,则可以建一条有向边<a, b>,当然,如果此单词可以翻转,则建成无向边(a, b),显然可以想到,每个单词用且只用一次使得所有单词连通,那就是说,找到一条路径,每条边都走过一次,如果闭合,显然就是欧拉回路,现在不要求闭合,算是欧拉路径。

如果不连通,或者连通度为奇数的点多于2个,显然不会有欧拉路径。判通可以用并查集来做。

先假设有欧拉路径,对起点a,终点b,加一条弧<b, a>,因为起点出度大于入度,度小于0,定向无向边的目的就是使得起点的度增加,所以这样加弧不影响欧拉路径,但是却构成了欧拉回路,最终求得欧拉回路也能保证欧拉路径的存在。

具体实现用最大流。建图方式见我另一篇讲解:混合图的欧拉回路

posted on 2010-08-21 11:51  ylfdrib  阅读(560)  评论(0编辑  收藏  举报