神奇脑洞题解——HDU1853 Cyclic Tour
对于二分图的最大匹配和对于带权二分图的最优匹配,B站上 CSU ACM—ICPC 的大佬们讲的已经很清楚了。 有需求的同学们可以去B站上学习一下。 悄悄说一声,讲课的陈佳妮小姐姐也曾经是位OIer,曾在CTSC2016上夺得银牌(因为在HN,好像没能去成NOI),讲解的方式也令OIers十分舒适。 题目大意:给一张有向图,要求选择任意多个环(可重复,非自环,环可以任选,不用相连),使得每个点都被访问过,而且经过的边权之和最小,求最小值 。 乍一看和二分图没有关系,但是仔细想一下,如果给图中每个点拆成两个(一个连接这个点的入点,一个连出点),那么因为要走环,那么最优情况肯定是每个环中有一个点会被访问两次,其他点都是一次,那这不就是赤果果的在拆点图上求最优匹配吗? 假设我们有一张图:1——>2——>3——>1,设拆出来的点i,用来连接入点的是i,连接出点的是i+n(此处n=4),那么我们拆点图长这样:5——>2,6——>3, 7——>1,这样就实际上是对拆出来的六个点进行了一次完全匹配。 那么,我们只要先判断拆点图能不能形成完美匹配,然后再跑一边KM就可以了(KM算法要求二分图存在完美匹配,否则会陷入死循环)。 放代码吧: #include<iostream> #include<cstdio> #include<vector> #include<algorithm> #include