码迷,mamicode.com
首页 > 其他好文 > 详细

网络流初步

时间:2018-07-29 23:25:34      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:csdn   网络流   while   算法   name   朴素   def   mes   names   

由于我比较懒

博客写的不够精致

所以

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; 
}

 

网络流初步

标签:csdn   网络流   while   算法   name   朴素   def   mes   names   

原文地址:https://www.cnblogs.com/yanlifneg/p/9388047.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!