首页 > 其他分享 >网络最大流

网络最大流

时间:2023-02-10 14:35:14浏览次数:51  
标签:return 最大 int 网络 long dep 流量 ri

网络流简介

网络

网络是指一个有向图 \(G=(V,E)\)。
每条边 \((u,v)\in E\) 都有一个权值 \(c(u,v)\),称之为容量(Capacity),当 \((u,v)\notin E\) 时有 \(c(u,v)=0\)。

设 \(f(u,v)\) 定义在二元组 \((u\in V,v\in V)\) 上的实数函数且满足
容量限制:对于每条边,流经该边的流量不得超过该边的容量,即,\(f(u,v)\leq c(u,v)\)
斜对称性:每条边的流量与其相反边的流量之和为 0,即 \(f(u,v)=-f(v,u)\)
流守恒性:从源点流出的流量等于汇点流入的流量,即 \(\forall x\in V-\{s,t\},\sum_{(u,x)\in E}f(u,x)=\sum_{(x,v)\in E}f(x,v)\)
那么 \(f\) 称为网络 \(G\) 的流函数。对于 \((u,v)\in E,f(u,v)\) 称为边的 流量,\(c(u,v)-f(u,v)\) 称为边的 剩余容量。整个网络的流量为 \(\sum_{(s,v)\in E}f(s,v)\),即 从源点发出的所有流量之和。
一般而言也可以把网络流理解为整个图的流量。而这个流量必满足上述三个性质。
注:流函数的完整定义为

\[f(u,v)=\left\{\begin{aligned} &f(u,v),&(u,v)\in E\\ &-f(v,u),&(v,u)\in E\\ &0,&(u,v)\notin E,(v,u)\notin E \end{aligned}\right. \]

其中有两个特殊的点:源点(Source)\(s\in V\) 和汇点(Sink)\(t\in V,(s\neq t)\)。

网络最大流

概述

令 \(G=(V,E)\) 是一个有源汇点的网络,我们希望在 \(G\) 上指定合适的流 \(f\),以最大化整个网络的流量(即 \(\sum_{(s,v)\in E}f(s,v)\)),这一问题被称作最大流问题(Maximum flow problem)。

AC·code
#include<bits/stdc++.h>
#define il inline
#define cs const
#define ri register
#define int long long
using namespace std;

namespace Q{
    il int rd(){
        ri int x=0;ri bool f=0;ri char c=getchar();
        while(!isdigit(c)) f|=(c==45),c=getchar();
        while(isdigit(c)) x=x*10+(c^48),c=getchar();
        return f?-x:x; 
    }
    il void wt(long long x){
        if(x<0) x=-x,putchar(45);
        if(x>=10) wt(x/10);
        return putchar(x%10|48),void();
    }
} using namespace Q;

cs int N=205,M=5005,inf=0x3f3f3f3f;

namespace edge{
    struct qwq{
        int v,w,nxt;
    }e[M<<1];
    int h[N];
    il void add(int u,int v,int w,int id){
        e[id]={v,w,h[u]},h[u]=id;
        e[id|1]={u,0,h[v]},h[v]=id|1;
        return;
    }
} using namespace edge;

namespace Dinic{
    int dep[N],now[N];
    queue<int> q; 
    il bool bfs(int s,int t){
        memset(dep,0,sizeof(dep));
        dep[s]=1,q.push(s);
        ri int u,v;
        while(!q.empty()){
            u=q.front(),q.pop(),now[u]=h[u];
            for(ri int i=h[u];i;i=e[i].nxt){
                v=e[i].v;
                if(!dep[v]&&e[i].w){
                    dep[v]=dep[u]+1,q.push(v);
                }
            }
        }
        return dep[t]!=0;
    }
    il int dfs(int u,int res,int t){
        if(u==t) return res;
        ri int tot=res,v,les;
        for(ri int i=now[u];i;i=e[i].nxt){
            v=e[i].v,now[u]=i;
            if(dep[v]==dep[u]+1&&e[i].w){
                les=dfs(v,min(e[i].w,tot),t);
                e[i].w-=les,e[i^1].w+=les,tot-=les;
                if(!tot) break;
            }
        }
        return res-tot;
    }
    il long long dinic(int s,int t){
        ri long long as=0;//不开long long见祖宗 
        while(bfs(s,t)){
            as+=dfs(s,inf,t);
        }
        return as;
    }
} using namespace Dinic;

signed main(){
    int n=rd(),m=rd(),s=rd(),t=rd();
    for(ri int i=1,u,v,w;i<=m;++i){
        u=rd(),v=rd(),w=rd(),add(u,v,w,i<<1);
    }
    wt(dinic(s,t));
    return 0;
}

标签:return,最大,int,网络,long,dep,流量,ri
From: https://www.cnblogs.com/windymoon/p/17103491.html

相关文章

  • 用window给jetson共享网络
    jetson不能连接无线网1.   2.WLAN的属性,变成共享   3.   4.   5.在另一个电脑上 ......
  • 6. Linux网络管理
    1.网络接口接口名称是软件,而网卡才是硬件。1.1网络接口名称规则以前CentOS(6及之前)网络接口被枚举为eth0,eth1,eth2...等,ethernet的简写,服务器为了备份,以防止单点网络故......
  • Linux查看网络带宽使用情况 (端口显示)
    Linux系统下如果服务器带宽跑满了,查看跟哪个ip通信占用带宽比较多,还可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等,详细的将会在后面的使用参数中说......
  • C语言填空:减损法求最大公约数
    #include<stdio.h>//<<九章算术>>更相减损法:可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。//以等数约之。///第......
  • 捡捡计算机网络①
    捡捡计算机网络,先看《网络是怎样连接的》。一、生成HTTP请求消息URL的各种格式 HTTP过程  HTTP主要方法  HTTP消息格式   表单中对方法的区别 H......
  • vue课程75 axios是只专注于网络请求的库
     <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"conte......
  • C语言填空:最大公约数
    //求最大公约数#include<stdio.h>main(){intm,n,i,k;scanf("%d,%d",【1】);k=【2】?m:n;for(i=k;i>=1;i--){if(【3】)......
  • Docker数据管理与网络通信dockerfile
    目录:Docker复习基础Docker数据管理1、数据卷2、数据容器端口映射容器互联(使用centos镜像)Docker镜像的创建1、基于现有镜像创建2、基于本地模板创......
  • C语言填空:最大值函数
    #include<stdio.h>//求两个数中的最大值intmax(inta,intb){return【1】;}main(){inta,b;scanf("%d%d",【2】);printf("max=%d",【3】)......
  • 神经网络基础部件-BN层详解
    一,数学基础1.1,概率密度函数1.2,正态分布二,背景2.1,如何理解InternalCovariateShift2.2,InternalCovariateShift带来的问题2.3,减少InternalCovariateShift......