题解 CF1027D 【Mouse Hunt】
2024-08-24 14:06:35
这道题原本写了一个很复杂的DFS,然后陷入绝望的调试。
看了一下题解发现自己完全想复杂了。
这里大概就是补充一些题解没有详细解释的代码吧。。。
(小声BB)现在最优解rank4(话说$O2$负优化什么鬼啊)
read(n);
for(register int i=;i<=n;++i)read(c[i]);
for(register int i=;i<=n;++i){
read(a[i]);
if(a[i]==i){
vis[i]=;
ans+=c[i];
}
}
for(register int i=;i<=n;++i){
if(vis[i])continue;
for(register int j=i;;j=a[j]){
if(vis[j]){
if(vis[j]==i+)ans+=find(j);
break;
}
vis[j]=i+;
}
}
write(ans);
程序主题内容如下。
前面是读入数据没有什么好讲的。
在读入a的时候先判断一下有没有自环,有的话就不用看了直接加上。
然后我们对每一个点都瞎搞搞(其实就是一个DFS)。
我们从这个点开始一直向下跳。如果遇到已经走过的点就说明有环出现了,这个时候根据vis的值决定是不是这一轮跳出的环(由于可能是之前的)。
然后我们在这个环上跑一下求最小值。(为什么只在环上不在链上前面题解讲得很清楚了)
如果不是已经走过的点,那我们还在链上,继续往下跳吧。
find函数如下:
inline int find(int s){
int res=c[s];
for(register int i=a[s];;i=a[i]){
if(i==s)return res;
else res=min(res,c[i]);
}
}
最新文章
- gzip: stdout: No space left on device问题的解决
- Jquery最全过滤器总结
- Hive简单优化;workflow调试
- 【USACO】pprime
- Strange Way to Express Integers (一般模线性方程组)
- angular学习(二):Controller定义总结
- ant利用先进,ant订单具体解释,ant包,ant包装删除编译jar文件
- jQuery获取当前对象标签名称
- ctrl+c 和 ctrl+z 的区别
- Python中urllib.urlencode中文字符的一个问题
- 我的pwn笔记
- 02.Numpy
- testng + reportng 测试结果邮件发送
- B - Cube HDU - 1220 (数学计数)
- BZOJ.1299.[LLH邀请赛]巧克力棒(博弈论 Nim)
- windows下前端开发工具遇到的问题总结(yeoman bower grunt)
- ORM的详解
- 学习sqlserve的一些笔记
- background-image:url(data:image/gif;base64,XXXX) base64方式将本地图片添加到文档中
- MIME类型是什么?包含哪些类型?