「网络流 24 题」魔术球 【最小路径覆盖】

2024-05-08 21:20

本文主要是介绍「网络流 24 题」魔术球 【最小路径覆盖】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

「网络流 24 题」魔术球

1

注意这里的球是依次放置,也就是说如果当前放到第 i i i 号球,那么 1 → i − 1 1 \rarr i - 1 1i1 号球都已经放好了,否则可以放无数个球

思路

首先我们对于 i < j 且 i + j = 完全平方数 i < j 且 i + j = 完全平方数 i<ji+j=完全平方数 连边: i → j i \rarr j ij
并且我们假设当前我们要构造答案 x x x,也就是说 [ 1 , x ] [1,x] [1,x] 号球我们都要放好
那么对于这张有 x x x 个点的有向无环图,我们等价于要找一些路径去覆盖整张图,并且路径数越少越好!同一路径上的点就表示我们将这些球按顺序放在同一柱子上

我们可以从小到大枚举答案 n n n,并且在之前的基础上添加新的有向边 i → n i f i + n = 完全平方数 i \rarr n \quad if \quad i + n = 完全平方数 inifi+n=完全平方数,然后跑一个最小路径覆盖,判断所需的柱子数是否小于等于给定的柱子数即可

时间复杂度: O ( n ⋅ ( n + n m ) ) , m O(n \cdot (n + nm)),m O(n(n+nm))m 为边数

// Problem: #6003. 「网络流 24 题」魔术球
// Contest: LibreOJ
// URL: https://loj.ac/p/6003
// Memory Limit: 256 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#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 longconst int INF=0x3f3f3f3f;
const long long INFLL=0x3f3f3f3f3f3f3f3fLL;typedef long long ll;const int N = 2500;std::vector<int> match; //match[i]表示每个右点i当前匹配的左点
std::vector<bool> used; //当前轮 右点 i 是否被预定
std::vector<int> g[N];bool dfs(int l){ //为当前左点 l 寻找匹配for(auto r : g[l])if(!used[r]){ //如果当前轮右点r还没有被预订used[r] = true; //预定if(!match[r] || dfs(match[r])){match[r] = l;return true;
//(1)如果右点 r 还没有配对
//(2)右点 r 已经配对,尝试更换其原配左点}}return false;
}int main(){std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int k;std::cin >> k;int cnt = 0;fore(n, 1, N){match.assign(n + 1, 0);fore(i, 1, n){ //在原先的基础上加边int w = i + n;int rt = sqrt(w);if(rt * rt != w)	continue;g[i].push_back(n);}int num = 0; //最大匹配数fore(i, 1, n + 1){used.assign(n + 1, false);num += dfs(i);}num = n - num; //最小路径覆盖if(num > k)	break; //柱子不够cnt = n;}std::cout << cnt << endl;std::vector<int> nxt(cnt + 1, 0);std::vector<bool> head(cnt + 1, true);fore(v, 1, cnt + 1){int u = match[v];if(!u)	continue;head[v] = false;nxt[u] = v;}fore(i, 1, cnt + 1){if(!head[i])	continue;int u = i;while(nxt[u]){std::cout << u << ' ';u = nxt[u];}std::cout << u << endl;}return 0; 
}

这篇关于「网络流 24 题」魔术球 【最小路径覆盖】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971467

相关文章

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

JAVA覆盖和重写的区别及说明

《JAVA覆盖和重写的区别及说明》非静态方法的覆盖即重写,具有多态性;静态方法无法被覆盖,但可被重写(仅通过类名调用),二者区别在于绑定时机与引用类型关联性... 目录Java覆盖和重写的区别经常听到两种话认真读完上面两份代码JAVA覆盖和重写的区别经常听到两种话1.覆盖=重写。2.静态方法可andro

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

Linux网络配置之网桥和虚拟网络的配置指南

《Linux网络配置之网桥和虚拟网络的配置指南》这篇文章主要为大家详细介绍了Linux中配置网桥和虚拟网络的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、网桥的配置在linux系统中配置一个新的网桥主要涉及以下几个步骤:1.为yum仓库做准备,安装组件epel-re

python如何下载网络文件到本地指定文件夹

《python如何下载网络文件到本地指定文件夹》这篇文章主要为大家详细介绍了python如何实现下载网络文件到本地指定文件夹,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下...  在python中下载文件到本地指定文件夹可以通过以下步骤实现,使用requests库处理HTTP请求,并结合o