网络最大流dinic模板

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int>q;
int INF=1e9;
int n,m,head[10005],cur[10005],ct=1,s,t,d[10005],ans;
struct N{
    int to,next,w;
}edge[200005];
void add(int x,int y,int z)
{
    edge[++ct]=(N){y,head[x],z};head[x]=ct;
    edge[++ct]=(N){x,head[y],0};head[y]=ct;
}
bool bfs()
{
    memset(d,0,sizeof d);
    while(q.size())q.pop();
    d[s]=1;
    q.push(s);
    while(q.size())
    {
        int x=q.front();q.pop();
        for(int i=head[x];i;i=edge[i].next)
        {
            int u=edge[i].to;
            if(!d[u]&&edge[i].w)//残量网络
            {
                d[u]=d[x]+1;
                q.push(u);
            }
        }
    }
    return d[t];
}
int dfs(int x,int f)
{
    if(x==t)return f;//
    int res=0,tmp=0;
    for(int i=cur[x];i;i=edge[i].next)
    {
        int u=edge[i].to;
        if(d[u]==d[x]+1&&edge[i].w)
        {
            tmp=dfs(u,min(edge[i].w,f-res));
            edge[i].w-=tmp;
            edge[i^1].w+=tmp;
            res+=tmp;
            if(edge[i].w)cur[x]=i;
            if(res==f)return f;//
        }
    }
    if(!res)d[x]=0;//剪枝
    return res;
}
int main()
{
    scanf("%d%d",&n,&m);
    scanf("%d%d",&s,&t);
    int x,y,z;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
    }
    while(bfs())
    {
        for(int i=1;i<=n;i++)cur[i]=head[i];
        ans+=dfs(s,INF);
    }
    printf("%d",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Zinn/p/8605756.html

时间: 2024-10-13 07:20:25

网络最大流dinic模板的相关文章

【算法】网络最大流 Dinic

Dinic的大体思路是和EK差不多的(其实很多算法的大体思路都一样),只不过Dinic在每次寻找增广路时先bfs一下,给每个点都加上一个等级,而规定:只有等级相邻的两个点之间才能走,那么在dfs时就会减掉很多无用因此不必要的道路 1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 #include<queue> 6 using na

网络最大流 dinic算法

一句话题意:给出一个网络图,以及其源点和汇点,求出其网络最大流 //dinic算法; //时间复杂度O(V^2E); #include<bits/stdc++.h> #define inf 999999 #define maxn 200000 using namespace std; int n,m,s,t; int ans=0; struct Edge { int to,next,w; }; struct Edge edge[maxn]; int head[maxn],val[maxn],p

[POJ 1273] Drainage Ditches &amp; 最大流Dinic模板

Drainage Ditches Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a

luogu3376 【模板】网络最大流 dinic

当前弧优化.单路增广 #include <iostream> #include <cstring> #include <cstdio> #include <queue> using namespace std; int n, m, ss, tt, uu, vv, ww, cnt, hea[10005], maxFlow, cur[10005], lev[10005]; const int oo=0x3f3f3f3f; queue<int> d;

网络流--最大流dinic模板

标准的大白书式模板,除了变量名并不一样……在主函数中只需要用到 init 函数.add 函数以及 mf 函数 1 #include<stdio.h> //差不多要加这么些头文件 2 #include<string.h> 3 #include<queue> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 const int maxm=150+5; //点的总数 8

HDU ACM 3572 Task Schedule 网络最大流-&gt;dinic算法

分析: 建图:每个任务和每一天分别看做一个点,添加源和汇点.源点和每个任务连一条边,每天边的容量为完成对应任务所需处理次数.若第i个任务能够在Si至Ei天处理,则由该任务向这些天分别连一条边,容量为1,表示此任务每天只能被处理一次.最后,每一天分别连一条边到汇点,容量为机器数M,即每天可以处理M个任务.若求出的最大流等于所有任务需要处理的次数之和,说明能完成任务:否则,不能. #include<iostream> #include<vector> #include<queue

POJ 1149 PIGS (网络最大流 Dinic 建对图你就赢了)

PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17598   Accepted: 7977 Description Mirko works on a pig farm that consists of M locked pig-houses and Mirko can't unlock any pighouse because he doesn't have the keys. Customers come t

P3376 网络最大流 【模板】

..突然发现自己拖了很久都没有学习有关网络流的东西了,所以先从模板开始写起吧. dinic code: #include<iostream> #include<cstring> #include<queue> #define INF 0x3f3f3f3f const int MAXN = 1e6+5; struct side{ int from,to,next,w; }edge[MAXN]; int head[MAXN],depth[MAXN],n,m,s,t,len=

最大流Dinic模板

1 int bfs() 2 { 3 queue<int>q; 4 memset(d,0,sizeof(d)); 5 d[1]=1; 6 q.push(1); 7 while (!q.empty()) 8 { 9 int u=q.front(); 10 q.pop(); 11 for (int i=head[u];i!=-1;i=eage[i].next) 12 { 13 int v=eage[i].v; 14 if (!d[v]&&eage[i].cap>0) 15 {