首页 > 其他分享 >网络流笔记

网络流笔记

时间:2024-03-01 20:11:43浏览次数:27  
标签:qu int flow 网络 笔记 edge dist now

资料

用最通俗的语言让你学会网络流

  1. $ \begin{array}{c}
    \left | f+f' \right | = \left | f \right | +\left | f' \right |
    \end{array}$
    所以,当可行流的残余网络有可行流,原网络的可行流一定不是最大流
  2. 对于任何一个可行解,都对应一个可行流 并且 对于任何一个可行流,都对应一个可行解

模板

网络最大流

Dinic算法

#include<bits/stdc++.h>
using namespace std;
const int MX_N=410,MX_M=5100;
struct node{
    int to,next,w;
}edge[MX_M<<1];
int head[MX_N]={0},edge_cnt=0;
inline void Add(int x,int y,int w){
    node &i=edge[edge_cnt];
    i.w=w,i.to=y,i.next=head[x];
    head[x]=edge_cnt++;
}
inline void add(int x,int y,int w){
    Add(x,y,w),Add(y,x,0);
}
int s=0,t=MX_N-1;
int cur[MX_N]={0},dist[MX_N]={0};
bool bfs(){
    for(int i=0;i<MX_N;i++)  cur[i]=head[i],dist[i]=-1;
    queue<int > qu;qu.push(s);dist[s]=0;
    while(!qu.empty()){
        int now=qu.front();qu.pop();
        for(int i=head[now];i!=-1;i=edge[i].next){
            int to=edge[i].to;
            if(dist[to]==-1&&edge[i].w){
                dist[to]=dist[now]+1;
                qu.push(to);
            }
        }
    }
    return dist[t]!=-1;
}
int dfs(int now,int flow){
    if(now==t)  return flow;
    int left=flow;
    for(int &i=cur[now];i!=-1;i=edge[i].next){
        int to=edge[i].to,w=edge[i].w;
        if(dist[to]==dist[now]+1&&w){
            int cur_flow=dfs(to,min(left,w));
            left-=cur_flow;
            edge[i].w-=cur_flow;
            edge[i^1].w+=cur_flow;
            if(left==0)  break;
        }
    }
    if(flow==left)  dist[now]=-1;
    return flow-left;
}
int dinic(){
    int sum=0;
    while(bfs()){
        sum+=dfs(s,0x3f3f3f3f);
    }
    return sum;
}
signed main(){
    memset(head,-1,sizeof(head));
    //=======================================================


    //=======================================================
    return 0;
}

最小费用最大流

EK(Spfa)

#include<bits/stdc++.h>
using namespace std;
const long long MX_N=5010;
const long long MX_M=50100;
struct node{
    long long to,next;
    long long w,cost;
}edge[MX_M<<1];
long long head[MX_N]={0},edge_cnt=0;
inline void add(long long x,long long y,long long w,long long c){
    node& it=edge[edge_cnt];
    it.cost=c;it.next=head[x];it.w=w;it.to=y;
    head[x]=edge_cnt++;
}
long long dis[MX_N]={0};bool flag[MX_N]={0};
long long last_edge[MX_N]={0},last_node[MX_N];
long long n,m,s,t;
bool spfa(){
    for(long long i=1;i<=n;i++)  dis[i]=0x3f3f3f3f,flag[i]=0,last_edge[i]=-1,last_node[i]=0;
    queue<long long > qu;
    qu.push(s);flag[s]=1;dis[s]=0;
    while(!qu.empty()){
        long long now=qu.front();qu.pop();flag[now]=0;
        for(long long i=head[now];i!=-1;i=edge[i].next){
            long long to=edge[i].to,cost=edge[i].cost;
            if(dis[to]>dis[now]+cost&&edge[i].w>0){
                dis[to]=dis[now]+cost;
                last_edge[to]=i;
                last_node[to]=now;
                if(!flag[to]){
                    qu.push(to);flag[to]=1;
                }
            }
        }
    }
    return dis[t]!=0x3f3f3f3f;
}

signed main(){
    memset(head,-1,sizeof(head));
    
    scanf("%lld%lld%lld%lld",&n,&m,&s,&t);
    for(long long i=1;i<=m;i++){
        long long u,v,w,c;
        scanf("%lld%lld%lld%lld",&u,&v,&w,&c);
        add(u,v,w,c);
        add(v,u,0,-c);   //反向边负花费
    }
    long long ans_flow=0,ans_cost=0;
    while(spfa()){
        long long cur_flow=0x3f3f3f3f,cur_cost=0;
        for(long long i=t;i!=s;i=last_node[i]){
            cur_flow=min(cur_flow,edge[last_edge[i]].w);
            cur_cost+=edge[last_edge[i]].cost;
        }
        ans_flow+=cur_flow;
        ans_cost+=cur_flow*cur_cost;

        for(long long i=t;i!=s;i=last_node[i]){
            long long now_edge=last_edge[i];
            edge[now_edge].w-=cur_flow;
            edge[now_edge^1].w+=cur_flow;
        }
    }
    printf("%lld %lld",ans_flow,ans_cost);
    return 0;
}

无源汇上下界可行流

#include<bits/stdc++.h>
using namespace std;
const int MX_N=310,MX_M=15010;
struct node{
    int to,next,w;
}edge[MX_M<<1];
int edge_cnt=0,head[MX_N]={0};
inline void Add(int x,int y,int w){
    node &i=edge[edge_cnt];
    i.w=w;i.to=y;i.next=head[x];
    head[x]=edge_cnt++;
}
inline void add(int x,int y,int w){
    Add(x,y,w),Add(y,x,0);
}
int cur[MX_N]={0},dist[MX_N]={0};
int n,s,t;
bool bfs(){
    for(int i=1;i<=n;i++)  dist[i]=-1;
    queue<int > qu;dist[s]=0;qu.push(s);
    while(!qu.empty()){
        int now=qu.front();qu.pop();
        for(int i=head[now];i!=-1;i=edge[i].next){
            int to=edge[i].to;
            if(dist[to]==-1&&edge[i].w){
                dist[to]=dist[now]+1;qu.push(to);
            }
        }
    }
    return dist[t]!=-1;
}
int dfs(int now,int flow){
    if(now==t)  return flow;
    int left=flow;
    for(int &i=cur[now];i!=-1;i=edge[i].next){
        int to=edge[i].to,w=edge[i].w;
        if(dist[to]==dist[now]+1&&w){
            int cur_flow=dfs(to,min(left,w));
            left-=cur_flow;
            edge[i].w-=cur_flow;
            edge[i^1].w+=cur_flow;
            if(left==0)  break;
        }
    }
    if(left==flow)  dist[now]=-1;
    return flow-left;
}
int flw[MX_N]={0};
int lower[MX_M]={0};
signed main(){
    memset(head,-1,sizeof(head));
    int input_n,m;int sum=0;
    scanf("%d%d",&input_n,&m);
    for(int i=1;i<=m;i++){
        int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);
        add(a+1,b+1,d-c);
        flw[a]-=c;flw[b]+=c;
        lower[i-1]=c;
    }
    /*
      s=1
      t=2+n;
      ni=1+i;
    */
    s=1,t=2+input_n,n=t;
    for(int i=1;i<=input_n;i++){
        if(flw[i]>0){
            add(s,i+1,flw[i]);sum+=flw[i];
        }
        else if(flw[i]<0){   //不能用else
            add(i+1,t,-flw[i]);
        }
    }
    int ans=0;
    while(bfs()){
        for(int i=1;i<=n;i++){
            cur[i]=head[i];
        }
        ans+=dfs(s,0x3f3f3f3f);
    }
    if(ans!=sum){
        printf("NO");return 0;
    }
    printf("YES\n");
    for(int i=0;i<m*2;i+=2){
        printf("%d\n",edge[i^1].w+lower[i/2]);
    }
    return 0;
}

标签:qu,int,flow,网络,笔记,edge,dist,now
From: https://www.cnblogs.com/DaiFu/p/18047852

相关文章

  • 10199元起 LG gram Pro 2024款笔记本上架:酷睿Ultra 7+120Hz OLED屏
    LGgramPro2024款笔记本目前已经上架,首发10199元起。设计上,新款笔记本的重量只有1199克,厚度仅为12.4毫米,轻薄机身可以轻松放入日常背包。据悉,新款笔记本提供了16英寸(16Z90SP)和17英寸(17Z90SP)版本,采用2.8KOLED屏幕,支持120Hz超高刷新率。性能上,新款笔记本可选英特尔酷睿Ultra......
  • 论文精读:基于图神经网络的时间序列模型(综述)
    论文精读:基于图神经网络的时间序列模型(预测任务部分)论文链接:https://arxiv.org/abs/2307.03759一、摘要时间序列数据的复杂在于涉及时间和变量之间的复杂相互作用以及变量之间的关系。与其他深度学习方法相比,图神经网络(GraphNeuralNetworks,GNNs)可以明确地建模变量间关系(多元......
  • Java 韩顺平老师的课,记的(前6章)笔记
    https://www.bilibili.com/video/BV1fh411y7R8/?p=110&spm_id_from=333.880.my_history.page.click&vd_source=92305fa48ea41cb7bedb3ab5e056d42d韩顺平老师在b站课的链接。 010,JDK的介绍 018,Java开发细节 6,一个源文件中最多只能有一个public类。其他类的个数不限。......
  • div3笔记
     Problem-E-Codeforces这道题用了记录一个数末尾零的板子(敲重点)!!!再说一遍,简单博弈论就是贪心!1voidsolve(){2cin>>n>>m;3vector<int>a(n),b(n);4for(inti=0;i<n;i++)cin>>a[i];5intlen=0;//这组数字总共有几位,总长度6......
  • Top 500 配置笔记
    因为某种原因需要在服务器上测试Top500。top500官网Top500是一个对计算机性能进行排榜的榜单,而Green500则是一个对计算机能耗进行排榜的榜单,能耗=性能/功耗,Green500可以说是Top500的一个Top500使用Linpack基准测试来测试服务器性能。Linpack的C语言实现HPL-用于分布式内存计......
  • (4 核,64 位)处理器LS1043AXN8QQB、LS1043AXN8KQA、LS1043AXN8PQA专为小规格网络、工业
    介绍Layerscape®LS1043A处理器是一款面向嵌入式网络的四核64位Arm®处理器。LS1043A可通过支持无风扇设计的灵活I/O封装,提供超过10Gbps的性能。这款SoC是专为小规格网络、工业和汽车应用而打造的解决方案,针对经济型低端PCB优化了物料成本(BOM),降低了电源成本,采用单时钟设计。......
  • (笔记)Linux下glog日志库的详细使用方法
     Glog是一个开源的C++日志库,它提供了非常方便的日志记录功能。下面是使用Glog的详细步骤: 一、安装Glog库您可以从Glog的官方网站(https://github.com/google/glog)下载Glog的源代码,然后进行编译和安装。在Linux系统下,您可以使用以下命令安装Glog库:sudoapt-getinstalllibg......
  • Lua学习笔记3
    Lua学习笔记3IO读写Lua中读写使用自带的I/O库处理文件。分为简单模式和完全模式。简单模式(simplemodel)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。完全模式(completemodel)使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件......
  • 2024-03-01-Linux高级网络编程(6-原始套接字)
    6.原始套接字6.1TCPUDP回顾数据报式套接字(SOCK_DGRAM)无连接的socket,针对无连接的UDP服务可通过邮件模型来进行对比流式套接字(SOCK_STREAM)面向连接的socket,针对面向连接的TCP服务可通过电话模型来进行对比这两类套接字似乎涵盖了TCP/IP应用的全部TCP......
  • Graph Contrastive Learning with Adaptive Augmentation 论文阅读笔记
    Abstract​ 尽管图CL方法得到了繁荣的发展,但图增强方案的设计——CL中的一个关键组成部分——仍然很少被探索。我们认为,数据增强方案应该保留图的内在结构和属性,这将迫使模型学习对不重要的节点和边缘的扰动不敏感的表示。然而,现有的方法大多采用统一的数据增强方案,如统一丢弃边......