Cyber

C/C++ Python hadoop Linux

网络流Dinic算法

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

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33506160/article/details/52352733
文章标签: 数据结构 算法
个人分类: 算法 数据结构
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭