「网络流 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

相关文章

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux修改pip和conda缓存路径的几种方法

《Linux修改pip和conda缓存路径的几种方法》在Python生态中,pip和conda是两种常见的软件包管理工具,它们在安装、更新和卸载软件包时都会使用缓存来提高效率,适当地修改它们的缓存路径... 目录一、pip 和 conda 的缓存机制1. pip 的缓存机制默认缓存路径2. conda 的缓

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

MySQL9.0默认路径安装下重置root密码

《MySQL9.0默认路径安装下重置root密码》本文主要介绍了MySQL9.0默认路径安装下重置root密码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录问题描述环境描述解决方法正常模式下修改密码报错原因问题描述mysqlChina编程采用默认安装路径,