给你n个节点,m条边组成的网络流,要求你求出每条边的流向; #include #include #include #include #include #include #include #include #include
分析: 题目不用求最大流, 而是求每条边的流向,这题是考察网络流的基本规律。 若某图有最大,则有与源点相连的边必然都是流出的,与汇点相连的边必然是流入的,其它所有点流入和流出的流量是相等的。
我们可以根据这一规律来求解。
先求出所有点(除了源点和汇点)的总流量(表示流入的流量的2倍),每次流过该边,更新的时候减去流入流量的2倍。
从源点出发广搜每个点,搜的过程可以确定经过边的流向,当某个点的剩余总流量为0时,表示流入该点的流量边已经都处理完毕,将这点入栈。
特别注意:当 这个点是汇点时不要入栈, 不然会从汇点回流过来,不符合基本规律。
此外:这个算法的关键核心是,
if(v!=n) deg[v]-=2*G[u][i].c;
if(!deg[v]) q.push(v); 因为一旦当前节点流入该节点跟新了这个节点后,这个节点deg==0的话,那么从这个
节点出发的访问未访问过的节点就只能是从改点流出了