網路流模板

2021-05-28 07:23:52 字數 1956 閱讀 8610

//鄰接矩陣

#include

#include

#include

using namespace std;

const int inf=(1<<30);

const int point_num=300;

int cap[point_num][point_num],dist[point_num],gap[point_num];//初始化見main裡面

int s0,t0,n;//源,匯和建圖後點數(0-n-1)

int find_path(int p,int limit=0x3f3f3f3f)

}int label=n;

for(int i=0;i0)  label=min(label,dist[i]+1);

if(--gap[dist[p]]==0  ||  dist[s0]>=n )   return -1;

++gap[dist[p]=label];

return 0;

}int sap()

int pig[1100];

int vis[1100];

int main()

return 0;

}鄰接表  較慢

#include

#include

#include

#include

const int inf=(1<<28);

using namespace std;

#define maxn 500000

struct edge

e[2*maxn];

int num,rnum;

int head[maxn],rhead[maxn];

int d[maxn];

int numb[maxn];

int start[maxn];

int n,m;//見圖後的點數(1->n)和原圖邊數

int p[maxn];

int source,sink;

//要初始化source 和 sink,重定義n

void init()

void bfs()

int q[maxn],head(0),tail(0);

d[sink]=0;

numb[0]=1;

q[++tail]=sink;

while(heade[i].f)

tmp=e[i].f;

}for(i=p[sink];i!=-1;i=p[e[i].u])

return tmp;

}int retreat(int &i)

}else

}return flow;

}//a->b=c;

void addedge(int a,int b,int c)

int main()

鄰接表 較快

#include

#include

#include

#include

using namespace std;

const int n=1010;

const int m=50000;

const int inf=(1<<28);

int head[n];

struct edge

edge[m];

int cnt,n,s,t;//n從0開始  0->n-1

void addedge(int u,int v,int w)

int sap()

{int pre[n],cur[n],dis[n],gap[n];

int flow=0,aug=inf,u;

bool flag;

for(int i=0; i0&&dis[u]==dis[v]+1)

{flag=1;

if(edge[j].w0&&dis[v]//初始化  cnt=0;memset(head,-1,sizeof(head));

網路流模板

最大流 最小割 演算法 最小割就是刪掉權值最小的邊讓源點和匯點分別分在兩個不連通的集合 就是把圖分成兩個集合,保證源點和匯點不連通,可以解決刪掉權值最小的邊刻意讓某些點和另外點孤立,也就是堵住前面點到匯點的去路 增廣路edmondskarp演算法 n m 2 n是點數,m是有向邊數 define r...

網路流模板

最大流 include include include include include include using namespace std define clr a x memset a x sizeof a const int maxm 1005 const int maxn 20 const...

網路流模板

dinic struct edge vector g max v int level max v int iter max v 當前弧優化 void add edge int from,int to,int cap 通過bfs計算從源點出發的距離標號 void bfs int s 通過dfs尋找增廣...