P2661 [NOIP 2015 提高组] 信息传递——染色做法

news/2025/2/22 13:09:45/文章来源:https://www.cnblogs.com/ccgc718/p/18730796

原题

本来想当水题刷的,结果被水题刷了。。。70到80到90到100,必须写个题解记录一下(doge)

题目分析


一句话:求一个无权有向图中的最短环路(确保有环)
tip:每一个点出度为一,那么必然有环,以样例为例如下。

思路


没必要每轮模拟全部的传送,只看某一个人的传送过程:

就1而言:他的信息一次经过1-2-4-3-2...就无法回到1处,时间理解为∞。

就2而言:2-4-3-2,需要经过3轮,时间便为3。

就4,3而言:与2一样都在环里,也是3。

就5而言:不在环里是∞。

综上最快3轮结束游戏。

tip:这些题从不同点上看会比宏观看有奇效。
接下来我就想到了用染色法(万恶的开始),Son[i]记录i的传输对象,col[i]记录i的颜色(col=color),依次遍历每个点,在遍历第i个点时,把i染色成1,再找下一个也就是Son[i],然后Son[Son[i]]...如果发现某个p点的下一个点son[p]==1,说明已经被遍历过,侧面反映成为了环。

在找到环后对从当前的开始给环染第二遍色(p一定在环里,感性理解)每个环里的点都变成2,并且每染一次用一个变量记录,便是当前i收到自己的信息和游戏结束需要的时间。

但当时我嫌麻烦,就每读取一次i就初始化一次col[ ],结果爆掉了(难受)。所以尝试优先队列优化,果然多过了一个样例,然后艰难改到90分,最后终于修成正解!

1.减少染色次数:在原始代码中,每个节点被染色两次(1和2),优化后的代码中,每个节点只被染色一次,减少了不必要的操作。

2.最小环长度的记录:使用一个变量minn 来记录最小环的长度,避免了使用优先队列的开销。

3.循环优化:在检测环的过程中,使用 do-while 循环来确保环的长度计算正确,并且减少了不必要的条件判断。

代码过程


70分暴力染色代码如下

#include<bits/stdc++.h>
using namespace std;
const int N=20005;
int ans=10000008,cnt=0;
int fa[N],col[N];int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>fa[i];}for(int i=1;i<=n;i++){cnt=0;col[i]=1;int p=i;while(col[fa[p]]!=1){p=fa[p];col[p]++;}while(col[fa[p]]!=2){p=fa[p];col[p]=2;cnt++;}ans=min(ans,cnt);memset(col,0,sizeof col);}cout<<ans;return 0;
} 

然后就...

呜呜呜...

80分暴力+优先队列优化代码

//在思考后,选用优先队列来代替min...
#include<bits/stdc++.h>
using namespace std;
const int N=200005;
int cnt=0,Son[N],col[N];
priority_queue<int,vector<int>,greater<int>> ans;int main(){int n;cin>>n;for(int i=1;i<=n;i++){cin>>Son[i];}for(int i=1;i<=n;i++){if(col[i]) continue;cnt=0;col[i]=1;int p=i;while(col[Son[p]]!=1){p=Son[p];col[p]=1;}if(col[p]==1){while(col[Son[p]]!=2){p=Son[p];col[p]=2;cnt++;}ans.push(cnt);}p=i;while(col[p]<2){col[p]=2;p=Son[p];}}while(ans.top()==1){ans.pop();}cout<<ans.top();return 0;
} 


难受...
最后,优化了染色次数,终于AC!!!

AC代码

#include<bits/stdc++.h>
using namespace std;
const int N=200005;
int Son[N],col[N];int main(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);int n;cin>>n;for(int i=1;i<=n;i++){cin>>Son[i];}int minn=N;for(int i=1;i<=n;i++){if(col[i]) continue;int cnt=0;int p=i;while(!col[p]){col[p]=1;p=Son[p];}if(col[p]==1){int start=p;do{cnt++;p=Son[p];}while(p!=start);minn=min(minn,cnt);}p=i;while(col[p]==1){col[p]=2;p=Son[p];}}if(minn==N){cout<<0;}else{cout<<minn;}return 0;
}


接下来也会更新拓扑做法,敬请期待!

谢谢观看★,°:.☆( ̄▽ ̄)/$:.°★

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有哪些好用的AI工具?(你想要的AI工具都在这)

1. 常见应用场景 1.1. 国内通用大模型模型名称 简介 官网地址DeepSeek 深度求索公司研发的高性能开源模型,以低成本、高推理能力著称,支持数学、代码等复杂任务。 https://chat.deepseek.com/豆包 字节跳动开发的智能语言模型,基于深度学习技术,支持多种自然语言处理任务。…

Kubernetes 集群上部署 Open WebUI

在前一篇博文中记录了 k8s 集群上部署 ollama + deepseek-r1:7b,这篇博文记录一下 Open WebUI 的部署。还是用 helm 部署,添加 open-webui 的 helm repo,准备 helm 清单文件,通过 helm 命令在 ai 命名空间下进行部署在前一篇博文中记录了 k8s 集群上部署 ollama + deepseek…

2025.2.22

Hehe_0 模拟赛内容随笔 [NOIP2015]金币1 2 3 4 。。。1 2-3 4-6 7-10 。。。观察数据范围1e4,暴力就行,然后可以去思考优化版本 由于已经把规律给出来了,所以可以提前离线处理出来,如果数据过大,可以预处理每一次金币变化的天数,然后根据提问二分找区间然后求和。这种数…

充电桩功能扩展,解决桩企内存不足的问题

OCPP(开放充电点协议)1.6是电动汽车充电基础设施中广泛使用的通信标准。尽管OCPP 1.6为充电桩与中央管理系统(CSMS)之间的交互提供了基本功能,但由于OCPP主板的内存资源有限,其能够实现的功能也受到了一定的限制。为了解决这一问题,OCPP协议网关作为OCPP主板的扩展,能够…

Spring复习-AOP

AOP的概念 AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,属性与属性、方法与方法、对象与对象都可以组成一个切面,而用这种思…

Univer sheet加载上下文菜单卡死崩溃问题定位

背景: 我的应用技术栈是Vue3,Univer是基于react的,所以定位问题花了很久,在此记录一下查问题的方式。 使用Chrome DevTools的Performance进行录制,复现卡死操作后,在Performance Monitr中可以看到CPU Usage持续100%,且页面重计算次数持续飙高。由于页面卡死,Performanc…

乐园杂音

沟槽的杉井光为什么还不填坑! 其实兔子最早看的一批轻小说就有乐杂,但是那时候没有写读后感的习惯,现在重刷一遍乐杂,就顺便写一下读后感。兔子每次给别人看这张图都会让他们猜女主是谁。 其实吧,虽然普遍认为《离别的钢琴奏鸣曲》比《乐园杂音》写的要好,但是兔子更喜欢…

一张图搞懂支付账务

会计与程序语言虽不同,却能从相同维度描绘业务场景。如何利用这一原理,拆解支付账务的科目设置、对账与核算流程,建立起清晰的账务处理逻辑?让我们一起一探究竟。学习账务的时候你是否经常有这些疑问“待结算和待清算是什么?为什么要有已清算?待结算和待清算是一回事吗?…

Diffusion-DPO:一种基于直接偏好优化的扩散模型对齐新方法

本文介绍了一种名为 Diffusion-DPO 的方法,该方法改编自最近提出的直接偏好优化 (DPO)。DPO 作为 RLHF 的简化替代方案,通过分类目标直接优化策略,以更好地满足人类偏好。诸如 GPT-4 和 Llama 2 等高性能大型语言模型 (LLM) 的训练通常分为两个阶段:https://avoid.overfit.…

联网搜索接口!大模型API和私有化部署联网搜索接口:基于互联网搜索服务的 API 接口技术分享与应用实践

联网搜索接口!大模型API和私有化部署联网搜索接口:基于互联网搜索服务的 API 接口技术分享与应用实践关键词:API 接口、互联网搜索、大模型、私有化部署、数据采集、技术分享、微信小程序、数字续坚、竞品对比一、引言在大模型 API 开发与私有化部署日益普及的背景下,如何在…

687. 最长同值路径(中)

目录题目题解:后序遍历 题目给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。 两个节点之间的路径长度 由它们之间的边数表示。题解:后序遍历通过深度优先搜索后序遍历二叉树,计算并更新每个节点…

week 01 C语言基础

Week01 一.语言基础认知 1.1 C语言是什么? 通过一系列的语法和语义规则来描述计算机程序的行为和逻辑,可以将程序转化为二进制指令,并由CPU执行。 语言=语法+逻辑 1.2 C语言的特点简洁C语言的语法简单,简单明了,使得程序易于阅读和理解。高效C语言的执行效率高,可以用于开…