「网络流 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中,如果你有一个相对路径并且想将其转换为绝对路径,你可以使用Path对象的resolve()方法,Path是Python标准库pathlib中... 目录1. os.path.abspath 是什么?怎么用?基本用法2. os.path.abspat

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

SpringBoot路径映射配置的实现步骤

《SpringBoot路径映射配置的实现步骤》本文介绍了如何在SpringBoot项目中配置路径映射,使得除static目录外的资源可被访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一... 目录SpringBoot路径映射补:springboot 配置虚拟路径映射 @RequestMapp

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

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

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

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

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