網絡流初步
阿新 • • 發佈:2018-07-30
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; }
網絡流初步