Dinic算法的算法是这样的:将整个网络划分成不同的层次,应该可以理解,用BFS且队列维护的方法一次访问的结点,并且标上他们的层次,这样的访问是最小的路径,可以不用来回的访问结点,这样就极大的减小了盲目的搜索,这就成了走最少的结点,也能找出增广路,这样不省时间,怎么样省呢?
其他的注意事项我都在代码中写了,大家看看,有需要指点的,请指明共同进步:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <vector>
#include <queue>
#include <string>
using namespace std;
const int MAXN = 100 + 11;
const int INF = 0x3fffffff;
struct Edge
{
int from, to;
int cap, flow; //注意这里的顺序是不能随便改变的,防止你下面插入边的时候顺序不同,就出大错了。
}edges;
struct Dinic
{
int N, M;
int s, t;
vector <Edge> edges;
vector <int> G[MAXN];
bool vis[MAXN];
int d[MAXN];
int cur[MAXN];
voi