首页 > 其他分享 >网络流-费用流

网络流-费用流

时间:2024-07-12 13:19:32浏览次数:18  
标签:费用 val vis int 网络 dep include

定义

给定一个有 \(n\) 个点 \(m\) 条边的网络,每条边有一个容量限制 \(C_{x\to y}\) 和一个使用的代价 \(w_{x\to y}\)。当边 \(x\to y\) 使用的流量为 \(f_{x\to y}\) 时,其花费的代价为 \(w_{x\to y}\times f_{x\to y}\)。这个网络中总共代价最少的最大流被称为最小费用最大流,总共代价最多的最大流被称为最大费用最大流。

注意:费用流是建立在最大流的基础上的,让流量的大小是第一关键字。

求解

因为最大流是一样的,所以依然可以套用 Dinic 的思路。因为 Dinic 的增广路长度是可以贪心的寻找的,所以只要每一次增广路的费用最小,那么就可以让费用最小。所以我们可以将将代价看作边权,把原本的 bfs 换成 spfa 找最短路。

如果需要求解费用最大最大流,那么只需要将所有的边取反,再跑一次费用最小最大流就可以了。

实现

#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#define int long long
using namespace std;
const int N=1e6,inf=0x3f3f3f3f3f3f3f3f;
struct node{int x,v,w,id;};
vector<node> v[N];
void add(int x,int y,int val,int w){
    int sti=v[x].size(),edi=v[y].size();
    v[x].push_back({y,val,w,edi});
    v[y].push_back({x,0,-w,sti});
}
int n,m,s,t,dep[N],p[N],sum;
bool vis[N];
bool bfs(){
	memset(dep,0x3f,sizeof(dep));
	memset(p,0,sizeof(p));
    memset(vis,0,sizeof(vis));
	queue<int> q;
	q.push(s);
	vis[s]=1,dep[s]=1;
	while(!q.empty()){
		int x=q.front();q.pop();
		vis[x]=0;
		for(node i:v[x]){
			if(i.v&&dep[x]+i.w<dep[i.x]){
				dep[i.x]=dep[x]+i.w;
				if(!vis[i.x]){
                    vis[i.x]=1;
                    q.push(i.x);
                }
			}
		}
	}
	return dep[t]!=inf;
}
int dfs(int x,int flow){
    if(x==t){
        return flow;
    }
    vis[x]=1;
    for(int i=p[x];i<v[x].size();i++){
        p[x]=i;
        int to=v[x][i].x,len=v[x][i].v;
        if(!vis[to]&&dep[x]+v[x][i].w==dep[to]&&len){
            int t=dfs(to,min(len,flow));
            if(t){
                v[x][i].v-=t;
                v[to][v[x][i].id].v+=t;
                sum+=t*v[x][i].w;
                return t;
            }
            else{
                dep[to]=-1;
            }
        }
    }
    vis[x]=0;
    return 0;
}
int dinic(){
    int ans=0;
    while(bfs()){
        ans+=dfs(s,inf);
    }
    return ans;
}
signed main(){
    cin>>n>>m>>s>>t;
    for(int i=1,x,y,val,w;i<=m;i++){
        cin>>x>>y>>val>>w;
        add(x,y,val,w);
    }
    cout<<dinic()<<' '<<sum<<'\n';
    return 0;
}

标签:费用,val,vis,int,网络,dep,include
From: https://www.cnblogs.com/liudagou/p/18298175

相关文章

  • 山东大学数据结构与算法课程设计实验4网络放大器设置问题
    问题描述 一个汽油传送网络可由加权有向无环图G表示。图中有一个称为源点的顶点S。从S出发,汽油被输送到图中的其他顶点。S的入度为0,每一条边上的权给出了它所连接的两点间的距离。通过网络输送汽油时,压力的损失是所走距离的函数。为了保证网络的正常运转,在网络传输中必须保......
  • Python UDP编程之实时聊天与网络监控详解
    概要UDP(UserDatagramProtocol,用户数据报协议)是网络协议中的一种,主要用于快速、简单的通信场景。与TCP相比,UDP没有连接、确认、重传等机制,因此传输效率高,但也不保证数据的可靠性和顺序。本文将详细介绍Python中如何使用UDP协议进行网络通信,并包含相应的示例代码,帮助全面掌......
  • PCDN技术如何应对网络带宽限制?(贰)
    PCDN技术应对网络带宽限制的操作主要包括以下几个方面:利用P2P技术:PCDN是以P2P技术为基础,通过挖掘利用边缘网络海量碎片化闲置资源来构建内容分发网络。这意味着,当用户从服务器下载资源时,其上行带宽也会被利用起来,贡献给其他用户,从而形成一个分布式的缓存网络。这种方式能有效......
  • 服务器redhat5.8网络问题,如何解决
    ......
  • Apifox报错404:网络错误,请检查网络,或者稍后再试的解决办法
    详细报错如图:解决办法:1、检查请求方法(get,post)是否正确,请求的URL是否正确,如果不正确,修改后重新发起请求;如果都正确,再参考22、复制curl用postman来请求第一步apifox复制出curl第二步postman导入curl第三步发起请求,如下图响应成功......
  • 网络和安全必背单词
    这些都是我认为程序员需要掌握的单词,就算有些英文你不熟悉,但是对应的中文至少了解什么意思。看完这个系列,希望你第一能认识更多单词,第二是拓宽自己的知识面,哪个概念不懂就自己去主动了解。计算机网络和安全是计算机学科中的两个非常关键的领域。以下是与这些领域相关的......
  • 同一局域网网络下怎么实现大文件互传
    目录一、设置共享文件夹二、访问共享文件夹一、设置共享文件夹1.1、右击自己想要共享的文件夹并点击属性1.2、点击属性中的共享并将该文件夹设置成共享即可 1.3、共享完成后网络路径下会有一串路径二、访问共享文件夹2.1、按win+E键打开文件资源管理器2.2、......
  • 基于业财一体化和数据集成的费用协同管理系统-虎珀
    某药企,作为高新技术企业、也是中国医药工业百强。其业务集药物研发、生产、销售、商业批发和国际营销为一体,为进一步提升集团内部费用管理的精细化与标准化水平,该企业决定引入先进的信息化费用核算系统,将其作为集团费用管理体系中的重要组成部分。此系统要能够适应不同公司组织间......
  • [笔记]网络原理3 - 传输层及其相关协议
    1.传输层中的一些基本概念TCP和UDP的一些区别UDP的数据格式,伪首部是固定的12bytes,源IP为017,也是固定表示UDP的。伪首部仅仅是用来计算校验和,不会传给网络层。源端口/目标端口:就是平时用到的port。源端口是临时开启的随机端口,目标端口有一些常用端口号如下图UDP......
  • [笔记]网络原理2 - 互连模型,物理层,数据链路层,网络层及其相关协议
    1.五层模型层层叠加,层层封装2.数据链路层中的一些概念MTU:最大传输单元,每一种数据链路层协议都规定了最大能传送的帧的数据长度上限,以太网的MTU最大为1500bytes,最小为64bytes。数据链路层会在数据包的左边(帧开始/结束符)右边(帧开始/结束符)都封装一些东西,封装成帧。......