http://acm.hdu.edu.cn/showproblem.php?pid=3376
这题是2686的加强版,用2686的方法照样可以解决,改成滚动数组就可以,另外也有网络流的解法:
拿第一个样例来说:
10 3
5 10
我们可以把每一个点看成两个映像,第一个看成 1与5,第二个 2与6,第三个 3与7,第四个 4与8,外加一个源点 0,汇点 9~
就变成了一个二分图:
1 5
2 6
0 3 7 9
4 8
接下来就是如何建图了:
1. 首先是源点,因为是从左上角开始,那么很好想,源点0与1连一条边,因为要两条路,那么源点过来的容量要为2,同理是汇点 9 与 8 连边,也是容量为2,两条边的费用都是0;
2. 其次是map[][]图如何对映到二分图上,就拿(1,1)这个点来说,首先它自己和自己的映像(1与5)之间是要建一条费用为map[1][1]即10的边,容量为1,代表(1,1)这个点走过了(走过了就得加上这条边的费用,将点与边对映上去);其次,(1,1)这个点它是可以走到(1,2)与(2,1)这两个点的:
模拟一下二分图,0走到1,1走到5,代表(1,1)这个点走过了,因为5到9是没有边的,
接下来为了能走到汇点9,
那么5应该回到二分图的左边,走到2或者3的位置,再由二分图的左边走向右边.....可以好好想下这个过程!所以得建5到2,和5到3的边(2,与3对映的是(1,2),(2,1)两点),这条边的容量为1,费用要为0,因为从(1,1)这个点走过来的,加上的只是(1,1)这个点的费用,这在1走到5的时候已经加过了!!要从2,3走到右边,走的时候自然会加上,所以费用为0,不然会导致重复加!
建边真的很奇妙,也就难在这里了,建好图之后就很简单,还是得多做题,接触多一点的建边模型!