网络流Dinic算法

原创 2016年08月29日 14:18:35
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cstdlib>
using namespace std;
int maxn=1e9;
int n,m,s,t,e,cost[1000],head[1000],pnt[1000*1000],next[1000],level[1000];
queue<int>q;
void add(int u,int v,int w)
{
    pnt[e]=v;
    cost[e]=w;
    next[e]=head[u];
    head[u]=e++;
    pnt[e]=u;
    cost[e]=0;
    next[e]=head[v];
    head[v]=e++;
}
int bfs(int s,int t)
{
    memset(level,0,sizeof(level));
    while(!q.empty())
    {
        q.pop();
    }
    level[s]=1;
    q.push(s);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        for(int i=head[u]; ~i; i=next[i])
        {
            int v=pnt[i];
            if(!level[v]&&cost[i])
            {
                level[v]=level[u]+1;
                q.push(v);
                if(v==t)
                    return level[v];

            }

        }

    }
    return level[t];
}
int dfs(int u,int maxf)
{
    int flow=0;
    if(u==t||maxf==0)
        return maxf;
    for(int i=head[u],f; ~i; i=next[i])
    {
        int v=pnt[i];
        if(level[v]==level[u]+1&&cost[i]&&(f=dfs(v,min(cost[i],maxf))))
        {
            cost[i]-=f;
            cost[i^1]+=f;
            maxf-=f;
            flow+=f;
            if(!maxf)
                break;
        }
    }
    if(!flow)
        level[u]=0;
    return flow;

}
int maxflow(int s,int t)
{
    int flow=0;
    while(bfs(s,t))
    {
        while(1)
        {
            int f=dfs(s,maxn);
            if(f==0)
                break;
            flow+=f;
        }
    }
    return flow;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        e=0;
        memset(head,-1,sizeof(head));
        while(m--)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add(u,v,w);
        }
        s=1;
        t=4;
        printf("%d\n",maxflow(s,t));

    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

poj1698-网络流,(Ek)和(Dinic)算法。

题目连接 开始学习网络流了,刚开就做这道题,确实不知道这么建图。 发现网络流建图很重要,图建好了,问题就好解决了,这题确实建图有难度。...

网络流——基础,Dinic和Sap(Gap优化)算法

网络流基本性质: 1、容量限制: f[u,v]

我的dinic算法网络流(详注解)

/*题目大意:求一个图中起点s到终点t的最大流除以s到t的的所有路径中的最大流量的那条路径流量值; (虽然这样看起来比较简单,但说实话,这题我读题至少都花了半个小时,直到ac的的前一秒我都有点怕题意...

网络流初体验——Dinic算法【poj1273】Drainage Ditches

Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This ...

POJ 1273 Drainage Ditches(网络流【Dinic算法】)

题目链接:http://poj.org/problem?id=1273Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K T...

最大网络流dinic算法—【hdoj1532】Drainage Ditches

题目hdoj1532传送门 落谷传送门 题意:给出n个河流,m个点,以及每个河流的流量,求从1到m点的最大流量。 Sample Input: 5 4 1 2 40 1 4 20 2 4 ...

网络流(Dinic算法)

此算法用vector实现,比较方便,并且一般shi不会

POJ 2135 Farm Tour (dinic算法,网络流)

构图方法:    注意题目中的边为无向边。新建源点s 和 汇点t 每两条道路连一条容量为1,费用为w的边。s到1连一条容量为1,费用为0 的边,n到 t 连一条容量为1,费用为0 的边,求最大流。 ...

网络流算法Dinic的Python实现

在上一篇我们提到了网络流算法Push-relabel,那是90年代提出的算法,算是比较新的,而现在要说的Dinic算法则是由以色列人Dinitz在冷战时期,即60-70年代提出的算法变种而来的,其算法...

[网络流]最大流算法 Dinic

最近做了几道题,发现用Ek算法会超时,而事实上,Ek算法使用的机会并不多,更多的是用Dinic和ISAP算法。所以特地找了一段时间来学习、理解和编Dinic算法。 类似之前的储存方法,但稍作修改,代码...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:网络流Dinic算法
举报原因:
原因补充:

(最多只允许输入30个字)