lightoj1086 - Jogging Trails(状态压缩dp)

lightoj1086 - Jogging Trails(状态压缩dp)

一道有点小思维的状态压缩dp

题意:给出n个点,m条边的一幅无向图,n<=15,m<=3000。问,从任意点出发,每条边至少走过一次,再回到起点,至少要走多少路。

解题思路:问题问的是,从起点出发,每条边至少走一次,然后又要回到这个点,那么,每个点也肯定至少被走到一次吧,这不就是一个欧拉回路吗?也就是说,这些边至少用到一次,去构造一个欧拉回路至少要多长距离咯。要构成欧拉回路,条件是每个点的度数为偶数,既然每条边都至少要走一次,那么就先把每条边加进来一次,然后统计一下加完之后的度数。根据图论握手定理的推论,无向图的奇度点必然是偶数个(想想也知道了),那么我们就每次拿出奇数度的两个点,构造一条新的边,把这两个点的度变为偶数,直到所有的点都是偶数度为止,这里用状态压缩就行了。然后就是两个奇度点之间新的一条边怎么构造了,很简单,floyd跑一遍就好了。这条新构造的边必然是最短的,而新加进来的边,也不会改变这条路径上的其他的度得奇偶性(路径上的其他点肯定是一进一出)。

代码:

你可能感兴趣的:(dp)