1. 程式人生 > >網絡流初步

網絡流初步

size pos ont ron sin 般的 cst scan +=

由於我比較懶

博客寫的不夠精致

所以

https://blog.csdn.net/txl199106/article/details/64441994

哈哈哈哈哈哈哈這個博客裏面的比喻能笑死哈哈哈哈哈哈

首先是一般的最大流算法

/*
一般增廣路算法(EdmondsKarp)
O m*m*n
codevs 1993
比較樸素的最大流算法
貪心的方法:找還可以放水的邊或者流量大於零反邊 
找到s-t的路徑 如果沒有 end 
否則 正向流量減去,反向加上相應的流量(類似回溯用)
每次Bfs找增廣路 記錄前驅
然後找路徑的最小值 更新網絡 
*/
#include<cstdio>
#include
<cstring> #include<iostream> #include<queue> #define maxn 210 using namespace std; int n,m,G[maxn][maxn],vis[maxn],pre[maxn],ans; queue<int>q; bool Bfs(){ while(!q.empty())q.pop(); memset(vis,0,sizeof(vis)); memset(pre,0,sizeof(pre)); q.push(1);vis[1]=1
; while(!q.empty()){ int k=q.front();q.pop(); for(int i=1;i<=n;i++) if(G[k][i]>0&&!vis[i]){ vis[i]=1;pre[i]=k;q.push(i); if(i==n)return 1; } } return 0; } int main(){ scanf("%d%d",&m,&n);
int u,v,t; memset(G,0,sizeof(G)); for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&t); G[u][v]+=t; } while(Bfs()){ int pos=n,mt=2e9; while(pre[pos]){ mt=min(mt,G[pre[pos]][pos]); pos=pre[pos]; } pos=n;ans+=mt; while(pos){ G[pre[pos]][pos]-=mt; G[pos][pre[pos]]+=mt; pos=pre[pos]; } } printf("%d\n",ans); return 0; }

網絡流初步