网络流–反向弧(背向边的作用)
今天来讲一讲网络流中背向边的作用,相信大家对下面代码很熟悉
void AddEdge(int from,int to,int cap){
edges.push_back(Edge(from,to,cap,0));
edges.push_back(Edge(to,from,0,0)); //背向边
m=edges.size();
G[from].push_back(m-2);
G[to].push_back(m-1);
}
很多人不明白 edges.push_back(Edge(to,from,0,0));中的0 ,0是什么意思,初学者会误认为容量和实际流量都设为0并没有意义。
但实际上这里的容量为0是针对于背向边实际流量为负数而设置的含义。
下面请看这张图:
图1到图2的过程很好理解,接下来是重点,如果没有背向边(也就是没有图中的一切红线),我们无法从1->3->4->2->5->6了,因为4->2的可增广流量已经为0,这个时候就体现了背向边的作用了,看见图2中4->2的红线了没,它在图中虽然是用红笔标注的正2,但在代码中他其实是-2,也就是说可以从4走到2,因为4到2的容量为0-(-2)=2,这个时候就体现出了背向边的作用, 理解了这个,就不难看懂图2到图3中构造的从1->3->4->2->5->6的路径了。