网络流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;
}

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

Dinic算法(网络流,最大流)

Dinic算法是用来解决网络流问题的经典算法,时间效率很快,还可以支持重边。下面让我来介绍一下Dinic算法。 首先,一条弧可以这样定义: struct edge{ int from , to , ...
  • ouqingliang
  • ouqingliang
  • 2016年08月12日 11:37
  • 3676

网络流Dinic算法详解及模板

在程序里,p表示找到的增广路径,p.top为路径中的最后一个顶点。一开始,p中只有源点。 整个While循环分为2个操作。如果p的最后一个顶点为汇点,也就是说找到了增广路,那么对p增广,注意到增广后一...
  • zhangliang011258
  • zhangliang011258
  • 2013年08月25日 08:50
  • 6660

网络流Dinic算法模板(各种优化)

#include #include #include #include #define inf 0x3f3f3f3f3f3f3f3f #define ll long long #define ...
  • lxy767087094
  • lxy767087094
  • 2016年12月13日 10:26
  • 519

[网络流]最大流算法 Dinic

最近做了几道题,发现用Ek算法会超时,而事实上,Ek算法使用的机会并不多,更多的是用Dinic和ISAP算法。所以特地找了一段时间来学习、理解和编Dinic算法。 类似之前的储存方法,但稍作修改,代码...
  • baidu_35009437
  • baidu_35009437
  • 2016年07月29日 21:30
  • 2202

网络流算法总汇(ek,dinic,isap)

网络流算法之EK 最基础的网络流算法 不停地找增广路进行增广,直到无法增广为止 时间复杂度O(VE^2) #include #include #include #include using nam...
  • clover_hxy
  • clover_hxy
  • 2016年02月18日 10:01
  • 823

网络流算法Dinic的Python实现

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

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

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

网络流-Dinic算法详解与模板

Dinic算法详解: 我们已经学过了求最大网络流的EK算法,EK算法的思想是每次用bfs找增广路,然后利用记录的路径回退到原点的过程更新网络。 (1)Dinic算法的思路是这样的:每次都不停地用B...
  • STILLxjy
  • STILLxjy
  • 2016年07月26日 19:57
  • 1760

网络流之最大流(FF, EK, Dinic, SAP)

对于Gap优化成立的解释: 假如某次修改d[u]后第一次出现断层k,显然d[u]之前是等于k的,而d[u]修改的原因是修改前d[u] < d[v]+1,所以d[v] > k-1,而因为出现断层k,d[...
  • yo_bc
  • yo_bc
  • 2017年05月31日 23:50
  • 657

网络流最大流EK和Dinic入门算法

网络流基础入门,这里不说那些证明过程了,直接个人见解。 首先:最大流,顾名思义,是从源点出发,经过若干条路径,最后到达汇点的所有流的和。而这里最大流的确定条件是,当前的网络中不存在增广路了。那什么是...
  • Mr__Kid
  • Mr__Kid
  • 2017年07月09日 19:44
  • 257
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:网络流Dinic算法
举报原因:
原因补充:

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