网络流
Posted ww123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络流相关的知识,希望对你有一定的参考价值。
#include <iostream> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <vector> #include <queue> using namespace std; const int maxn = 2000010; const int maxm=1010; const int inf =0x3f3f3f3f; int head[maxn],dis[maxn]; struct Edge { int to,next,f; }edge[maxm]; //链式前向星 int s,t,cnt; void add(int u,int v,int f) { edge[cnt].to=v; edge[cnt].f=f; edge[cnt].next=head[u]; head[u]=cnt++; //正向建边 edge[cnt].to=u; edge[cnt].f=0; edge[cnt].next=head[v]; head[v]=cnt++; //反向建边 } bool bfs() //增广路 { memset(dis,-1,sizeof(dis)); queue <int> que; dis[s]=0; que.push(s); while(!que.empty()) { int u=que.front(); que.pop(); for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; int f=edge[i].f; if(dis[v]==-1&&f>0) { dis[v]=dis[u]+1; if(v==t) return true; que.push(v); } } } return false; } int dfs(int x,int maxf) //更新 { if(x==t||maxf==0) return maxf; int flow=0; for(int i=head[x];i!=-1;i=edge[i].next) { int v=edge[i].to; int f=edge[i].f; if(dis[v]==dis[x]+1&&f>0) { f=dfs(v,min(f,maxf-flow)); edge[i].f-=f; edge[i^1].f+=f; flow+=f; if(flow==maxf) return flow; } } return flow; } int main() { int T,cas=0,n,m,k; scanf("%d",&T); while(T--) { cnt=0; memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); // 起点 汇点 s=1,t=n; for(int i=0;i<m;i++) { int u,v,f; scanf("%d%d%d",&u,&v,&f); add(u,v,f); //加边 } int ans=0; while(bfs()) { ans+=dfs(s,inf); } cout<<ans<<endl; } }
以上是关于网络流的主要内容,如果未能解决你的问题,请参考以下文章
此应用小部件片段中所有意图 (PendingIntents) 的逻辑流
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装