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

网络流 初见

时间:2015-02-08 12:44:52      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

今天学习了一下ISAP算法,简单的进行了网络流的实现。

 

cogs885 草地排水

题目大意:赤裸裸的网络流模板题。

技术分享
#include<iostream>
#include<cstdio>
using namespace std;
int map[201][201]={0},dis[201]={0},gap[201]={0},pre[201]={0};
int sap(int stt,int enn)
{
    int i,y,ans=0,u;
    bool f=false;
    gap[0]=enn;u=stt;pre[stt]=stt;
    while(dis[stt]<enn)
    {
        f=false;
        for (i=1;i<=enn;++i)
        {
            if (map[u][i]>0&&dis[u]==dis[i]+1)
            {
                f=true;
                break;
            }
        }
        if (f)
        {
            pre[i]=u;u=i;
            if (u==enn)
            {
                y=2100000000;
                for (i=enn;i!=stt;i=pre[i])
                    y=min(y,map[pre[i]][i]);
                ans+=y;
                for (i=enn;i!=stt;i=pre[i])
                {
                    map[pre[i]][i]-=y;
                    map[i][pre[i]]+=y;
                }
                u=stt;
            }
        }
        else
        {
            --gap[dis[u]];y=enn;
            if (gap[dis[u]]==0) return ans;
            for (i=1;i<=enn;++i)
                if (map[u][i]>0&&dis[i]<y) y=dis[i];
            dis[u]=y+1;
            ++gap[dis[u]];
            u=pre[u];
        }
    }
    return ans;
}
int main()
{
    freopen("ditch.in","r",stdin);
    freopen("ditch.out","w",stdout);
    
    int n,m,i,j,si,ei,ci;
    scanf("%d%d",&m,&n);
    for (i=1;i<=m;++i)
    {
        scanf("%d%d%d",&si,&ei,&ci);
        map[si][ei]+=ci;
    }
    printf("%d\n",sap(1,n));
    
    fclose(stdin);
    fclose(stdout);
}
View Code

 

网络流 初见

标签:

原文地址:http://www.cnblogs.com/Rivendell/p/4279833.html

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