#include<bits/stdc++.h>
using namespace std;
const int MAXN = 300;
const long long INF = 1e18;
bool vis[MAXN][MAXN];
long long flow[MAXN],c[MAXN][MAXN];
vector<int> ve[MAXN];
int d[MAXN];
int n,m,s,t;
bool bfs(){
memset(d,0,sizeof(d));
//memset(pre,-1,sizeof(pre));
queue<int> q;
q.push(s);
d[s] = 1;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i=0;i<ve[u].size();i++){
int v = ve[u][i];
if(d[v]||c[u][v]<=0) continue;
d[v] = d[u]+1;
q.push(v);
}
}
if(d[t]==0) return false;
return true;
}
long long dfs(int u,long long flow){
if(u==t) return flow;
long long out=0;
for(int i=0;i<ve[u].size();i++){
int v = ve[u][i];
if(d[v]!=d[u]+1||c[u][v]<=0) continue;
long long delta = dfs(v,min(flow,c[u][v]));
if(delta<=0) continue;
c[u][v]-=delta;
if(!vis[v][u]){
vis[v][u] = true;
ve[v].push_back(u);
}
c[v][u]+=delta;
return delta;
}
// if(out==0) d[u]=0;
return 0;
}
long long get_maxFlow()
{
long long maxFlow = 0, tmp;
while(bfs())
while(tmp = dfs(s, INF))
maxFlow += tmp;
return maxFlow;
}
int main(){
memset(c,0,sizeof(c));
memset(vis,0,sizeof(vis));
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=0;i<m;i++){
int u,v;
long long w;
scanf("%d%d%lld",&u,&v,&w);
c[u][v]+=w;
if(!vis[u][v]){
ve[u].push_back(v);
vis[u][v] = true;
}
}
printf("%lld",get_maxFlow());
return 0;
}
网络流 模板(仅供个人复习用)
最新推荐文章于 2024-09-22 16:01:11 发布
该博客介绍了如何运用 Dinic 算法解决图论中的最大流问题,通过 C++ 实现了一个简单的 Dinic 算法,并在样例中展示了如何读取输入数据构造图并求解最大流。代码中定义了相关数据结构,如邻接矩阵、流量和距离数组,以及辅助的 BFS 和 DFS 函数,最终输出最大流的值。
3730

被折叠的 条评论
为什么被折叠?



