「网络流 24 题」试题库 【最大流】

news2025/4/11 5:34:25

「网络流 24 题」试题库

1

思路

建立超级源点 S S S 和超级汇点 T T T,将每一类题目拆分为入点 i n in in出点 o u t out out,连边 i n → o u t in \rarr out inout,边权为 k i k_i ki,也就是所需的题目数量,同时连边 o u t → T out \rarr T outT;并对每一道题目及其对应的类型 p i p_i pi,连边 i → i n p i i \rarr in_{p_i} iinpi,容量为 1 1 1 S → i S \rarr i Si 边权同样为 1 1 1

跑最大流即可,看看最大流量是否为 m m m,按照残余网络的流量来输出方案

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;

const int INF=0x3f3f3f3f;
const long long INFLL=1e18;

typedef long long ll;

constexpr int inf = 1E9;

template<class T>
struct Dinic {
    struct _Edge {
        int to;
        T cap;
        _Edge(int to, T cap) : to(to), cap(cap) {}
    };
    
    int n; //点的数量,编号从 1 开始
    std::vector<_Edge> e; //链式前向星
    std::vector<std::vector<int>> g; //起到链式前向星nxt的作用
    std::vector<int> cur; //当前弧优化
    std::vector<int> h; //深度
    
    Dinic() {}
    Dinic(int n) {
        init(n);
    }
    
    void init(int n) {
        this->n = n;
        e.clear();
        g.assign(n + 1, {});
        cur.resize(n + 1);
        h.resize(n + 1);
    }
    
    bool bfs(int s, int t) { //构造分层图
        h.assign(n + 1, -1);
        std::queue<int> que;
        h[s] = 0;
        que.push(s);
        while (!que.empty()) {
            const int u = que.front();
            que.pop();
            for (int i : g[u]) {
                auto [v, c] = e[i];
                if (c > 0 && h[v] == -1) { //下一层有容量的邻居
                    h[v] = h[u] + 1;
                    if (v == t) {
                        return true;
                    }
                    que.push(v);
                }
            }
        }
        return false;
    }
    
    T dfs(int u, int t, T f) {
        if (u == t) {
            return f;
        }
        auto r = f;
        for (int &i = cur[u]; i < int(g[u].size()); ++i) {
            const int j = g[u][i];
            auto [v, c] = e[j];
            if (c > 0 && h[v] == h[u] + 1) {
                auto a = dfs(v, t, std::min(r, c));
                e[j].cap -= a;
                e[j ^ 1].cap += a;
                r -= a; //r是剩余可用流量
                if (r == 0) {
                    return f;  //如果r用完,说明f跑满了
                }
            }
        }
        return f - r; //否则f-r就是已用流量
    }
    void addEdge(int u, int v, T c) {
        g[u].push_back(e.size()); //记录在e中的下标
        e.emplace_back(v, c);
        g[v].push_back(e.size()); //反向边
        e.emplace_back(u, 0);
    }
    T flow(int s, int t) {
        T ans = 0;
        while (bfs(s, t)) {
            cur.assign(n + 1, 0); //当前弧初始化
            ans += dfs(s, t, std::numeric_limits<T>::max());
        }
        return ans;
    }
    
    std::vector<bool> minCut() { //最小割
        std::vector<bool> c(n + 1);
        for (int i = 1; i <= n; i++) {
            c[i] = (h[i] != -1);
        }
        return c;
    }
    
    struct Edge {
        int from;
        int to;
        T cap;
        T flow;
    };
    std::vector<Edge> edges() {
        std::vector<Edge> a;
        for (int i = 0; i < e.size(); i += 2) {
            Edge x;
            x.from = e[i + 1].to;
            x.to = e[i].to;
            x.cap = e[i].cap + e[i + 1].cap;
            x.flow = e[i + 1].cap;
            a.push_back(x);
        }
        return a;
    }
};

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int k, n;
    std::cin >> k >> n;
    int sum = 0;
    int S = 2 * n + k + 3, T = S + 1;
    Dinic<int> dinic(2 * n + k + 5);
    fore(i, 1, k + 1){
        int w;
        std::cin >>  w;
        sum += w;
        dinic.addEdge(2 * n + i, T, w);
    }
    fore(i, 1, n + 1){
        int in = 2 * i - 1, out = 2 * i;
        dinic.addEdge(S, in, INF);
        dinic.addEdge(in, out, 1);
        int m;
        std::cin >> m;
        while(m--){
            int x;
            std::cin >> x;
            dinic.addEdge(out, 2 * n + x, 1);
        }
    }

    if(dinic.flow(S, T) != sum){
        std::cout << "No Solution!";
        return 0;
    }


    auto edge = dinic.edges();
    std::vector<std::vector<int>> ans(k + 1, std::vector<int>());
    for(auto [fr, to, cap, flow] : edge){
        if(fr <= 2 * n && fr % 2 == 0 && to > 2 * n && to <= 2 * n + k && flow){
            int u = fr >> 1, v = to - 2 * n;
            ans[v].push_back(u);
        }
    }

    fore(i, 1, k + 1){
        std::cout << i << ": ";
        for(auto x : ans[i]) std::cout << x << ' ';
        std::cout << endl;
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1656838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cannot import name ‘ForkProcess‘ from ‘multiprocessing.context‘问题解决

问题描述 cannot import name ForkProcess from multiprocessing.context 问题原因 ForkContext用于Unix系统。SpawnContext可以在 Windows 环境中使用 解决方案 改成SpawnProcess就可以运行了 将原来的ForkProcess修改为SpawnProcess wrappers.py脚本&#xff0c;下面的代…

Python学习——环境搭建

Python 介绍 Python&#xff08;英国发音&#xff1a;/ˈpaɪθən/ 美国发音&#xff1a;/ˈpaɪθɑːn/&#xff09;是一种广泛使用的解释型、高级编程、通用型编程语言&#xff0c;由吉多范罗苏姆创造&#xff0c;第一版发布于1991年。可以视之为一种改良&#xff08;加入…

QGraphicsView实现简易地图12『平移与偏移』

前文链接&#xff1a;QGraphicsView实现简易地图11『指定层级-定位坐标』 提供地图平移与偏移功能。地图平移是指将地图的中心点更改为给定的点&#xff0c;即移动地图到指定位置。地图偏移是指将当前视口内的地图向上/下/左/右/进行微调&#xff0c;这里偏移视口宽/高的四分之…

商务分析方法与工具(六):Python的趣味快捷-字符串巧妙破解密码本、身份证号码、词云图问题

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

【Pytorch】1.读取训练数据集

导入Dataset类 from torch.utils.data import Dataset # 注意是Dataset&#xff08;大写&#xff09;的才是类通过jupyter我们可以阅读一下Dataset类的具体使用方法 help(Dataset) # 或者直接 Dataset??我们可以看到具体对Dataset类的解释 从蓝色字体我们可以得出 所有的代…

【Vue】Vue packages version mismatch(vue 和 vue-template-compiler)

报错&#xff1a;Vue packages version mismatch 原因&#xff1a;vue和vue-template-compiler版本不一样解决&#xff1a;如上vue版本为 2.6.14&#xff0c;vue-template-comiler版本为2.7.16。将vue-template-comiler版本设置为和vue版本一致即可。 npm install vue-templat…

中国M2总量是两个美国,意味着什么

中国人民银行公布数据&#xff1a;2月末&#xff0c;我国广义货币(M2)余额299.56万亿元&#xff0c;同比增长8.7%。 2000年末我国M2仅13万亿元&#xff0c;2013年3月达到100万亿元&#xff1b;2020年1月突破200万亿元&#xff1b;2024年2月接近300万亿元&#xff0c; 与美欧日…

阵痛中的乳业产业,何时才能成为下一个啤酒产业?

说起饮品&#xff0c;近年来中国啤酒业中各大品牌齐齐聚焦高端化的趋势绝对值得一提。然而&#xff0c;与之相反&#xff0c;国内乳业却是仍未进入高端化阶段&#xff0c;甚至陷入了周期底部中。 图源&#xff1a;中国圣牧财报 增收降利 牧企承受巨大的供需缺口压力 从产业链…

【Docker】新手教程的第一个demo:Wordpress

1 任务简单介绍 WordPress是什么&#xff1a; 是一个常用博客软件简单易部署&#xff0c;只需要两个容器&#xff08;业务容器 数据库容器&#xff09; 本文借鉴博客&#xff0c;使用自建 WordPress 容器方法在Docker上部署Wordpress&#xff0c;本地环境为Mac时使用该博客…

基于Detectron2的计算机视觉实践

书籍&#xff1a;Hands-On Computer Vision with Detectron2: Develop object detection and segmentation models with a code and visualization approach 作者&#xff1a;Van Vung Pham&#xff0c;Tommy Dang 出版&#xff1a;Packt Publishing 书籍下载-《基于Detectr…

大数据Scala教程从入门到精通第五篇:Scala环境搭建

一&#xff1a;安装步骤 1&#xff1a;scala安装 1&#xff1a;首先确保 JDK1.8 安装成功: 2&#xff1a;下载对应的 Scala 安装文件 scala-2.12.11.zip 3&#xff1a;解压 scala-2.12.11.zip 4&#xff1a;配置 Scala 的环境变量 在Windows上安装Scala_windows安装scala…

嵌入式Linux学习第四天启动方式学习

嵌入式Linux学习第四天 今天学习I.MX6U 启动方式详解。I.MX6U有多种启动方式&#xff0c;可以从 SD/EMMC、NAND Flash、QSPI Flash等启动。 启动方式选择 BOOT 的处理过程是发生在 I.MX6U 芯片上电以后&#xff0c;芯片会根据 BOOT_MODE[1:0]的设置来选择 BOOT 方式。BOOT_M…

002-ChatGLM4接入Langchain

智谱AI GLM-4 新一代基座大模型GLM-4,整体性能相比GLM3全面提升60%,逼近GPT-4;支持更长上下文;更强的多模态;支持更快推理速度,更多并发,大大降低推理成本;同时GLM-4增强了智能体能力。 基础能力(英文):GLM-4 在 MMLU、GSM8K、MATH、BBH、HellaSwag、HumanEval等…

C语言 举例说明循环嵌套

今天 我们来说循环的嵌套 如果一个循环体内 又包含了另一个循环结构 我们称之为循环的嵌套 我们之前学的 While do-while for 都可以进行相互的嵌套 如下图 在 While 循环语句中再嵌套一个 While 循环语句 do-while 中嵌套 do-while for中嵌套 for 例如 我们做一个九九乘法…

微服务---gateway网关

目录 gateway作用 gateway使用 添加依赖 配置yml文件 自定义过滤器 nacos上的gateway的配置文件 我们现在知道了通过nacos注册服务&#xff0c;通过feign实现服务间接口的调用&#xff0c;那对于不同权限的用户访问同一个接口&#xff0c;我们怎么知道他是否具有访问的权…

帮助命令

1.man 原意&#xff1a;manual 所在路径&#xff1a;/usr/bin/man 执行权限&#xff1a;所有用户 语法&#xff1a;man [命令或配置文件] 功能描述&#xff1a;获得帮助信息 例&#xff1a;$ man ls 查看ls命令的帮助信息 查看命令的帮助主要是看这个命令是干什么用的&am…

数据库加密数据模糊匹配查询技术方案

文章目录 前言沙雕方案内存加载解密密文映射表 常规做法实现数据库加密算法参考 分词组合加密&#xff08;推荐&#xff09; 超神方案总结个人简介 前言 在数据安全性和查询效率之间找到平衡是许多数据管理系统所面临的挑战之一。特别是在涉及加密数据的情况下&#xff0c;如何…

走进香港美食宛如走进香港电影

&#xff08;1&#xff09; 过去蔡澜有个节目&#xff0c;专门介绍香港美食&#xff0c;身边美女相伴、眼里美景相随。 过去离香港海关近&#xff0c;有时候散步都能走到那里&#xff0c;打车时车都不蹦字儿。那时候精神头儿真好&#xff0c;周六一早6点就起来拖着大箱子过关&a…

UE5材质基础(2)——数学节点篇1

UE5材质基础&#xff08;2&#xff09;——数学节点篇1 目录 UE5材质基础&#xff08;2&#xff09;——数学节点篇1 Add节点 Append节点 Abs节点 Subtract节点 Multiply节点 Divide节点 Clamp节点 Time节点 Lerp节点 Add节点 快捷键&#xff1a;A鼠标左键 值相加…

Ansible简介版

目录 架构 环境部署 一、Ansible安装部署 1.yum安装Ansible 2.修改主机清单文件 3.配置密钥对验证 4.ansible-doc 5.看被控主机 二、常用模块 1.Command模块 2.Shell模块 3.Cron模块 1.添加 2.删除 4.User模块 5.Group模块 1.创建组 ​编辑 ​编辑 ​编辑…