網路流演算法

2021-08-20 04:02:41 字數 2904 閱讀 2929

ek演算法模板 演算法複雜度 n*m*m (n為點數,m為邊數) 源點 1, 匯點 n。

const int maxn=310,inf=0x7fffffff;

int pre[maxn],mat[maxn][maxn];

bool vis[maxn];

int n,m;

int augment()

else q.push_back(i);}}

}if(!fnd) return 0;

v=m;

int mi=inf;

while(pre[v])

v=m;

while(pre[v])

return mi;

}

例題 poj 1273 drainage ditches

#include #include #include #include #include #include using namespace std;

const int maxn=310,inf=0x7fffffff;

int pre[maxn],mat[maxn][maxn];

bool vis[maxn];

int n,m;

int augment()

else q.push_back(i);}}

}if(!fnd) return 0;

v=m;

int mi=inf;

while(pre[v])

v=m;

while(pre[v])

return mi;

}int main()

int ans=0,aug;

while(aug=augment())

cout時間複雜度 o(n*n*e)  (推薦)

struct nodeedge[maxn<<1];

int head[maxn];

int cnt,dis[maxn],n,m,ans;

void init()

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

bool bfs()}}

if(dis[m]<0) return 0;

return 1;

}int fnd(int x,int low)

}return 0;

}void dinic()

printf("%d\n",ans);

}

各種優化:

#include #include #include #include #define inf 0x3f3f3f3f3f3f3f3f  

#define ll long long

#define maxn 10005

using namespace std;

int n,m;//點數、邊數

int sp,tp;//原點、匯點

struct node

mp[maxn*10];

int pre[maxn],dis[maxn],cur[maxn];//cur為當前弧優化,dis儲存分層圖中每個點的層數(即到原點的最短距離),pre建鄰接表

int cnt=0;

void init()//不要忘記初始化

void add(int u,int v,int w)//加邊

bool bfs()//建分層圖

} }

return dis[tp]!=-1;

} ll dfs(int u,ll cap)//尋找增廣路

} if(!res)

dis[u]=-1;

return res;

} ll dinic()

return ans;

} int main()

當前弧優化的dinic

#include #include #include #include #include #include using namespace std;  

const int maxn=1e5+10,inf=0x7fffffff;  

int n,m,f,e,s,t;  

struct edge  

};  

struct dinic  

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

bool bfs()  

}  }  

return vis[t];  

}  int dfs(int x,int cap)  

return flow;  

}  }dc;

poj 1273

#include #include #include #include #include #include using namespace std;

const int maxn=310,inf=0x7fffffff;

struct nodeedge[maxn<<1];

int head[maxn];

int cnt,dis[maxn],n,m,ans;

void init()

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

bool bfs()}}

if(dis[m]<0) return 0;

return 1;

}int fnd(int x,int low)

}return 0;

}void dinic()

printf("%d\n",ans);

}int main()

dinic();

}return 0;

}

網路流演算法

問題描述 如圖4 1所示是聯結某產品地v1和銷售地v4的交通網,每一弧 vi,vj 代表從vi到vj的運輸線,產品經這條弧由vi輸送到vj,弧旁的數表示這條運輸線的最大通過能力。產品經過交通網從v1到v4。現在要求制定乙個運輸方案使從v1到v4的產品數量最多。圖 4 1 圖 4 2 一 基本概念及相...

網路流演算法

網路流演算法 網路流演算法用於解決從源點到匯點最大流的問題。edmonds karp演算法 演算法主要思想 每次bfs找到一條從源點到匯點的最少路徑數的可行路徑,同時把這條路徑塞滿,這條路上的最小容量即為這條路徑的流量。然後將這條路徑的正向邊刪除,增加一條容量相同的反向邊,當bfs無法進行下去的時候...

網路流演算法

看見了一篇非常不錯的博文 1 容量限制 2 流量守恆 3 斜對稱性 x向y流了f的流 y就向x流了 f的流 殘留網路 容量網路 流量網路 這個等式是始終成立的 殘留值當流量值為負時甚至會大於容量值 流量值為什麼會為負?有正必有負,記住斜對稱性 最短路徑增廣演算法 增廣路方法是很多網路流演算法的基礎 ...