Dijkstra的最小费用最大流问题
对于最小费用最大流问题,它的重点就在于 “增广路” 什么是 增广路? 就是在以找的的路的基础上再加一条路 加上这条路能让结果更大,直接使用 Dijkstra 能找的的路是最短的路,继续用能找到剩下路中间的最小路, 但是这两条路加上来不一定是总体的最小路 ,第一次 1->3 ->5->4->6 第二次1->2->6 这并不是我们需要的结果,所以在找第二条最短路时,我们需要能反悔,能不 让第一次不走3->5,怎么反悔,在构建图时加上一条反边,第一次走了多少正边减少多少反边加上多少,这样第二次就可以走5->3然后走3->6这条线,第一次走了3->5,第二次凑了5->3相当与反悔了第一次的路,这样就能尽可能的走最小路。 #include<iostream> #include<cstring> #include<queue> using namespace std; /*6 11 1 2 23 1 3 12 1 4 99 2 5 17 2 6 73 3 5 3 3 6 21 4 6 8 5 2 33 5 4 5 6 5 20*/ #define MAX 23060 int MinCos; int v,cnt; int Head[MAX]; int Next[MAX]; int F[MAX];//流量 int To[MAX];//终结的 int Dis[MAX]; int Cos[MAX];/