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

网络流 最小费用最大流

时间:2024-10-10 17:23:12浏览次数:11  
标签:费用 ch int 最小 网络 vis cost include dis

#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
#include <numeric>
#include <functional>
#include <set>
#include <cmath>
#include <random>
#include <chrono>
#include <iomanip>

//#define NDEBUG
//#include <cassert>

#define DEBUG(x) cout<<(x)<<endl;
#define DEBUGA(l,r,a) for (int i=l;i<=r;++i) cout<<a[i]<<' ';cout<<endl;
#define lson (rt<<1)
#define rson (rt<<1|1)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pll;
typedef pair<int,int> pii;
const int maxn=2e5+7;
const int inf=0x3f3f3f3f;
const int mod=998244353;
// mt19937_64 rnd_64(chrono::system_clock::now().time_since_epoch().count());

inline int read(){
    int x=0,w=0;char ch=0;
    while (ch<'0'||ch>'9') {w|=ch=='-';ch=getchar();}
    while (ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return w?-x:x;
}

inline void write(int x){
    if (x<0) putchar('-'),x=-x;
    if (x>9) write(x/10);
    putchar(x%10+'0');
}

struct MCMF{
    //dinic

    struct edge{
        int v, nxt, cap, cost;
        edge(){}
        edge(int v, int nxt, int cap, int cost): v(v), nxt(nxt), cap(cap), cost(cost){}
    };
    vector<edge> e;
    int cnt;
    vector<int> head, cur;

    int n, m, S, T;
    ll maxflow, mincost;
    vector<int> dis, vis;

    MCMF(int _n,int _m,int _S,int _T): n(_n), m(_m), S(_S), T(_T){
        head.assign(n+1, -1);
        vis.assign(n+1, 0);
        cnt=0;
        e.assign(m<<1, edge());
    }

    void addedge(int u, int v, int w, int c){
        e[cnt] = {v, head[u], w, c};
        head[u] = cnt++;
        e[cnt] = {u, head[v], 0, -c};
        head[v] = cnt++;
    }

    bool spfa(){
        dis.assign(n+1, inf);
        queue<int> q;
        dis[S] = 0;
        vis[S] = 1;
        q.push(S);
        while (!q.empty()){
            int u = q.front(); q.pop();
            vis[u] = 0;
            for (int i=head[u]; ~i; i=e[i].nxt){
                int v = e[i].v;
                if (e[i].cap && dis[v] > dis[u]+e[i].cost){
                    dis[v] = dis[u]+e[i].cost;
                    if (!vis[v]) q.push(v), vis[v] = 1;
                }
            }
        }
        return dis[T]!=inf;
    }

    int dfs(int u, int flow){
        if (u==T) return flow;
        int res = 0;
        vis[u]=1;
        for (int& i = cur[u]; ~i && res<flow; i = e[i].nxt){
            int v = e[i].v;
            if (!vis[v] && e[i].cap && dis[v]==dis[u]+e[i].cost){
                int d=dfs(v, min(e[i].cap, flow-res));
                if (d) {
                    mincost += d * e[i].cost;
                    e[i].cap -= d;
                    e[i^1].cap += d;
                    res += d;
                }
            }
        }
        vis[u]=0;
        return res;
    }

    pll mcmf(){
        maxflow = mincost = 0;
        while (spfa()){
            cur.assign(head.begin(), head.end());
            int x;
            while (x = dfs(S,inf)) maxflow += x;
        }
        return {maxflow, mincost};
    }
};

void solve(){
    int n,m,s,t;
    cin>>n>>m>>s>>t;
    MCMF mf(n+1, m<<1, s, t);
    int u,v,w,c;
    while (m--){
        cin>>u>>v>>w>>c;
        mf.addedge(u, v, w, c);
    }
    auto [maxflow, mincost] = mf.mcmf();
    cout<<maxflow<<" "<<mincost<<endl;
}


int main(int argc,char* argv[]){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T=1;
//    cin>>T;
    while (T--) solve();

    return 0;
}

标签:费用,ch,int,最小,网络,vis,cost,include,dis
From: https://www.cnblogs.com/qsbqsbqym/p/18456786

相关文章

  • 神经网络章节感知机部分 误分类点到线性分割超平面的距离公式 解释说明
    公式8-4的内容如下:S=−1∣......
  • 计算机网络
    B/SC/S架构B/S分布性强、维护方便、开发简单且共享性强,总体拥有成本低,但数据安全性问题,对服务器要求过高、数据传输速度慢、软件个性化明显降低C/S交互性强,具有安全的存取模式,网络通信量低,响应速度快,利于处理大量数据,但该结构程序是针对性开发,变更不够灵活,维护和管理难度......
  • 20222313 2024-2025-1《网络与系统攻防技术》实验一报告
    1.实验内容本次实践的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个......
  • 什么是网络安全网络安全包括哪几个方面学完能做一名黑客吗?
    提及网络安全,很多人都是既熟悉又陌生,所谓的熟悉就是知道网络安全可以保障网络服务不中断。那么到底什么是网络安全?网络安全包括哪几个方面?通过下文为大家介绍一下。一、什么是网络安全?网络安全是指保护网络系统、硬件、软件以及其中的数据免受未经授权的访问、使用、......
  • 0基础能不能转行做网络安全?
    0基础能不能转行做网络安全?网络安全人才发展路线最近有同学在后台留言,0基础怎么学网络安全?0基础可以转行做网络安全吗?以前也碰到过类似的问题,想了想,今天简单写一下。我的回答是先了解,再入行。具体怎么做呢?首先,你要确定学习方向。网络安全是一个很大的概念,包含的东西也......
  • 20222326 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    一、实验内容Linux基本操作的学习能熟练的熟悉文件修改、打开,查看文件夹内容能正常使用gdb、vi可以理解汇编语言、机器指令、EIP的内容等理解可执行文件和机器指令例如call指令反汇编指令objdump文件十六进制转换指令%!xxd与%!xxd-r逆向工程学习如何分析和......
  • 20222419 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容1.1本周学习内容(1)了解了缓冲区溢出发展历史:红色代码、冲击波病毒、震荡波病毒、心脏出血、乌克兰断网、勒索病毒。(2)了解了缓冲区溢出漏洞的本质和危害:缓冲区溢出漏洞是由于程序没有进行严格的内存越界检查,导致数据溢出并覆盖相邻内存空间,从而可能被攻击者利用执行恶......
  • 基于模糊神经网络的移动机器人路径规划matlab仿真
    1.程序功能描述基于模糊神经网络的移动机器人路径规划1.环境地图中的障碍物为静态、未知障碍物,可以随机设置。(一般设置5~7个,为计算简便设置成规则性状的障碍物)2.机器人的行进方向为X轴的正方向,X轴逆时针旋转90°即为Y轴。两驱动轮之间的距离为50cm,驱动轮的直径为30cm。机器人的......
  • 机器学习之神经网络Neural Network
    第一部分:基本含义神经网络(NeuralNetwork)是一种模仿人脑神经元连接方式的机器学习模型,用于处理复杂的非线性问题。通过大量的参数和层级结构,神经网络可以学习数据中的特征,应用于分类、回归等任务。机器学习和人类实现人生巅峰的例子对比:如果把人比作神经网络,一次次摔倒就是......
  • Springboot二手车估值与销售网络平台l0471(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表客户,汽车分类,车辆信息,车辆估价,商家开题报告内容一、研究背景随着汽车消费市场的不断扩大和二手车交易的增多,设计和实现一个二手车估值与销售网络平台具有重......