首页 > 其他分享 >P2765 魔术球问题(最小路径点覆盖)

P2765 魔术球问题(最小路径点覆盖)

时间:2024-05-14 22:53:44浏览次数:19  
标签:re int res 路径 魔术 点数 match P2765

link

这个题目很不同,它给出的是柱子的数量,要反推球的数量。

可以这样认为,给出边数,求上面的点数。

  • 每次只能在某根柱子的最上面放球 -> 点的连接方式是一串串的,易发现图是个 DAG

然后好像没什么可推的性质了。

题目没给出点数,那肯定要去不断试不同的点数 n ,每次进行判定是否符合条件,这是很朴素的想法。

可以对当前 n 讨论,

因为图建模要保证任意两点编号和为完全平方数,考虑 \(O(n^2)\) 互相枚举所有 1 ~ n 的点,满足条件就连边。

发现图建出来,存在很多条子路径上任意两点都满足题目性质,而要用柱子串住这些点,

不就是 最小路径点覆盖 问题吗?


现在推判定条件,求最多能有多少个点能被 m 条路径覆盖,

  • 当 res < m,显然不够,还要加点;
  • 当 res = m,可能还有更大的答案,继续加点;
  • 当 res = m + 1,这样考虑,这个条件等价于多出刚好一个点,需要刚好多加一条边覆盖,而这个状态上再去掉这个点,就一定是 m 条边能覆盖的最大点数,否则矛盾;

所以当判定符合条件后,n -- 便是答案,注意:因为改变了点,所以之后要再跑一边增广。


然鹅,这样做会 T,

显然 \(O(n^2)\) 的建图不够优,发现题中的图是连续的,后边的点可以在原有图的基础上加。

所以不需要每次推倒重来, \(O(n)\) 连续建图即可。

同样的,因为图是连续的,所以很多答案是之前跑增广就得到的匹配答案,对当前,如果已经匹配有点了,直接更新即可。

#include <bits/stdc++.h>
#define re register int 
using namespace std;
const int N = 2e3;
struct edge
{
	int to, next;
}e[N * N];
int top, h[N];
int match[N], rev_m[N], res;
int m, n;
bool vis[N], used[N];
map<int, bool> f;

inline void add(int x, int y)
{
	e[++ top] = (edge){y, h[x]};
	h[x] = top;
}

bool dfs(int u)
{
	for (re i = h[u]; i; i = e[i].next)
	{
		int v = e[i].to;
		if (vis[v] || v > n) continue;
		vis[v] = true;
		if (!match[v] || dfs(match[v]))
		{
			match[v] = u;
			rev_m[u] = v;
			return true;
		}
	}
	return false;
}

inline int work()
{
	res = 0;
	for (re i = 1; i <= n; i ++)
	{
		memset(vis, false, sizeof(vis));
		res += (rev_m[i] || dfs(i)); // 优化 2 
	}
	
	return n - res;
}

inline void pass(int u)
{
	cout << u << ' ';
	used[u] = true;
	
	if (!rev_m[u] || used[rev_m[u]]) return;
	pass(rev_m[u]);
}

inline void print()
{		
	for (re i = 1; i <= n; i ++)
		if (!used[i])
		{
			pass(i);
			cout << '\n';
		}

}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> m;
	for (re i = 1; i <= N; i ++) f[i * i] = true;
	
	while (++ n)
	{
		for (re i = 1; i < n; i ++)
			if (f[i + n]) add(i, n); // 优化 1 
			
		if (work() == m + 1)
		{
			n --;
			cout << n << '\n';
			break;
		}
	}
	work();
	print();
	
	return 0;
}

标签:re,int,res,路径,魔术,点数,match,P2765
From: https://www.cnblogs.com/hi-zwjoey/p/18192443

相关文章

  • 64 - Minimum Path Sum 最小路径和
    64-MinimumPathSum最小路径和问题描述Givenamxngridfilledwithnon-negativenumbers,findapathfromtoplefttobottomright,whichminimizesthesumofallnumbersalongitspath.Note:Youcanonlymoveeitherdownorrightatanypointinti......
  • 合合信息携手业界专家,解码数据资产管理方法与入表的关键路径
    随着财政部印发的《企业数据资源相关会计处理暂行规定》提出企业数据资产入表相关办法,《数据资产评估指导意见》中进一步规范数据资产评估行为,细化数据资产评估操作要求,对解决数据要素市场建设中的“数据赋值”难题提供了有效方案。数据资产管理与入表成为当前社会关注热点和数据......
  • 使用joinjs绘制流程图(八)-实战-绘制流程图+节点路径自定义
    效果图代码<template><divclass="app"><divref="myholder"id="paper"></div></div></template><script>import*asjointfrom'@joint/core'import$from'jque......
  • 如何快速提取出一个文件里面全部指定类型的文件的全部路径
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z打开工具,切换到第五个模块,文件批量复制模块(快捷键:Ctrl+5)点击右边的“搜索添加”按钮,我这里就从我的PS文件夹里面找出全部的jpg图片叭,勾选两项,搜文件,并且搜全部子文件,然后点开始搜索按钮搜索完之后关闭窗口,就......
  • 图 - 存储结构 & 最短路径 & 最小生成树 & 拓扑排序 & 关键路径
    图的四种存储结构邻接矩阵有一个存储顶点的顺序表和一个存储边/弧的二维数组。存储结构#defineMaxInt32767#defineMVNum100//最大顶点数typedefstruct{VerTexTypevexs[MVNum];//顶点顺序表ArcTypearcs[MVNum][MVNum];//邻接矩阵intvexnum,arcn......
  • 如何批量删除多个不同路径的文件但又保留文件夹呢
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z1、我准备了三个文件夹(实际操作的时候可能是上百个文件夹,无所谓),里面都放了两个图片2、然后打开工具,使用文件批量复制的模块,勾选“复制时先清空…”的选项,注意,第一栏“要复制的文件和文件夹”里面为空,这样就想相......
  • Windows防火墙的注册表清理 ,可能需要清理的与Windows防火墙相关的注册表项及其路径:
    针对Windows防火墙的注册表清理的底层原理涉及到Windows操作系统中的注册表和防火墙配置:注册表:Windows操作系统中的注册表是一个重要的系统数据库,用于存储系统和应用程序的配置信息。在注册表中,包含了各种设置和选项,包括网络和防火墙配置。Windows防火墙:Windows操作系统......
  • react中使用craco,针对路径转换,修改webpack别名路径配置
    1.0首先下载craco依赖包npminstall@craco/craco-D2.0在项目根目录下面新建craco.config.js文件,里面内容配置为constpath=require('path')module.exports={webpack:{alias:{'@':path.resolve(__dirname,'src')}......
  • .gitignore 全局忽略提交特定文件夹,不限路径递归忽略
    创建或修改全局.gitignore文件:在命令行中执行以下命令来创建或修改全局的.gitignore文件gitconfig--globalcore.excludesfile~/.gitignore_global如果文件已存在,则此命令会确保Git使用正确的文件。接下来,编辑这个文件(如果它不存在,这一步骤也会创建它):touch~/.gitig......
  • 路径规划-PRM算法(1)
    probabilisticroadmap(PRM)算法是一类用于机器人路径规划的算法,最早在[1]中被提出,属于随机规划器的一种,其数据的主要形式为无向图(另一种RRT基于树)。[^2]将PRM算法分成了两个阶段:learning阶段和query阶段。其中learning阶段主要在configuration空间(机械臂的话是\(C\)......