zoj 3811 untrusted patrol

昨天网赛的C题,我负责的,题意有些模模糊糊的

我首先弄清楚了题意,即要求一个patrol是否可能巡视过所有的点,首先整个图要是连通的,这个在建图的时候边用下并查集即可,然后某些点装了传感器,传感器应该要全部都响应过才行,即L==k否则直接输出No,然后就是重点,给出的传感器的响应先后顺序,我们要在图上找到这样一种路径,路径上的传感器的先后顺序正好对应了给出的记录,找不到则是No,找到了就是Yes。

我一开始看到点有10万个,想用DFS+回溯尝试每种路径,最多20W条的路,但是路径种树就远远不止了。。所以抱着尝试的心态,这样的子TLE了就知道不是这种方法了。

后来就是我坑了,聪哥想了一种BFS的方法,只要对所有点遍历一遍即可,我听了两遍才搞清楚,而且还歪曲了其中一个重要的思想,导致第一次敲出的BFS还WA了一发。他给我讲完之后,我理解的思路是从传感器的第一个出发,往下进行搜索,是普通点就vis掉加入队列,是我们当前要找的下一个传感器就也vis掉加入队列,并且把一个cur标记++,这样如果存在这样的路径,最后的cur就==k,然后这种方法其实是错的,这就是我忽略了聪哥给我讲的思想的重要一点,因为题目里面传感器是只记录第一次到达的时间,所以可以来回走,这么说的话,我要找的传感器的序列 不一定要是真的存在一条路径上,只要走回之前的点,能找到下一个新的传感器也是合理的

。。。

所以这就不能用普通的找路径的BFS了,我用个染色标记,记录当前传感器是否已经被访问过,首先把第一个传感器标记,并且打入队列,然后走一遍BFS,把所有可以访问到的传感器都染色一下,但不入队列,之后又对下一个传感器首先判断是否被染过色,染过就入队列,像刚刚一样,BFS,把之后可能遍历到的传感器又染色。。如果我下一个要进队列的传感器没有被染过色,直接return false,因为说明肯定没有这样的路径能直接进入下一个传感器。。。如果整个能一套走完就返回true

这样子BFS首先保证了传感器的访问顺序严格按要求,中间不会插入其他传感器,并且因为我每次把当前传感器 ,对之后可能遍历到的传感器都染色,这样对于来回走的情况也考虑到了,不会漏情况

之前聪哥给我讲的时候,没领会这个重要思想,弄得搞半天才出来。这个怪我。而且这个其实应该容易想到,至少我上面那种错误的BFS方法要可以想的到,居然在那里呆了好久,都没想到。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int N = 100010;
int n,m,k,L;
int order[N];
int inq[N];
vector<int> G[N];
int fa[N];
int vis[N];
int a,b;
int findset(int x)
{if (x!=fa[x]){fa[x]=findset(fa[x]);}return fa[x];
}
bool bfs()
{queue<int> q;vis[order[0]]=1;for (int i=0;i<L;i++){if (vis[order[i]]) q.push(order[i]);else return false;while (!q.empty()){int u=q.front();q.pop();for (int i=0;i<G[u].size();i++){int v=G[u][i];if (inq[v]) vis[v]=1;else{if (vis[v]) continue;vis[v]=1;q.push(v);}}}}return true;
}
int main()
{int t;scanf("%d",&t);while (t--){scanf("%d%d%d",&n,&m,&k);for (int i=0;i<=n;i++){G[i].clear();fa[i]=i;vis[i]=0;inq[i]=0;}for (int i=0;i<k;i++){scanf("%d",&order[i]);inq[order[i]]=1;}while (m--){scanf("%d%d",&a,&b);G[a].push_back(b);G[b].push_back(a);int r1=findset(a);int r2=findset(b);if (r1!=r2) fa[r1]=r2;}scanf("%d",&L);for (int i=0;i<L;i++) scanf("%d",&order[i]);if (L<k){puts("No");continue;}int rt=findset(n);bool flag=1;for (int i=1;i<n;i++){if (findset(i)!=rt){flag=0;break;}}if (!flag) {puts("No");continue;}flag=bfs();if (flag) puts("Yes");else puts("No");}return 0 ;
}

 

转载于:https://www.cnblogs.com/kkrisen/p/3961481.html

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

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

相关文章

上周热点回顾(9.1-9.7)

热点随笔&#xff1a; 魅族的“火爆”预定表示“呵呵呵”-不要怪我拆穿&#xff08;tankaixiong&#xff09; 【调侃】IOC前世今生&#xff08;家住腊树下&#xff09; 跟着8张思维导图学习javascript&#xff08;Ico_Coco&#xff09; 下一代Asp.net开发规范OWIN&#xff08;…

mockito手动注入依赖_依赖注入–手动方式

mockito手动注入依赖依赖注入是一种将行为与依赖解决方案分开的技术。 用简单的话来说&#xff0c;它使开发人员可以定义具有特定功能的类&#xff0c;这些功能取决于各种协作者&#xff0c;而不必定义如何获取对这些协作者的引用。 以此方式&#xff0c;实现了各个组件之间的解…

ubuntu使用root权限登录的设置方法

Ubuntu系统默认是不允许用户以root身份登录的&#xff0c;在网上找到的方法如下&#xff1a; 1、首先设置root密码&#xff0c;利用现有管理员帐户登陆Ubuntu&#xff0c;在终端执行命令&#xff1a;sudo passwd root&#xff0c;接着输入密码和root密码&#xff0c;重复密码。…

visio 小技巧

Visio作图非常的方便 目前我还是用Visio2003&#xff0c;有一些小技巧&#xff0c;记录一下。 1、visio修改文本框文字对齐方式。默认的对齐方式是上下、左右居中。修改的位置: 在一个文档中可以插入多个标签页&#xff0c;当需要分页&#xff0c;用不同页归类不同信息的时候使…

java实现bean实体与map集合相互转换

方法一 //bean装换成map public static Map<?, ?> objectToMap2(Object obj) { if(obj null) return null; return new org.apache.commons.beanutils.BeanMap(obj); } 方法二 //bean装换成map public static Map&l…

java中字符串的精确匹配_Java最佳实践–字符串性能和精确字符串匹配

java中字符串的精确匹配在使用Java编程语言时&#xff0c;我们将继续讨论与建议的实践有关的系列文章&#xff0c;我们将讨论String性能调优。 我们将专注于如何有效地处理字符串创建&#xff0c; 字符串更改和字符串匹配操作。 此外&#xff0c;我们将提供我们自己的用于精确字…

My.Ioc 代码示例——避免循环依赖

本文的目的在于通过一些示例&#xff0c;向大家说明 My.Ioc 支持哪些类型的依赖关系。也就是说&#xff0c;如何设计对象不会导致循环依赖。 在 Ioc 世界中&#xff0c;循环依赖是一个顽敌。这不仅因为它会导致 Ioc 容器抛出异常&#xff0c;而且还因为它是不可预知的&#xff…

java实现base64加密解密

/** * 加密 * param str * return */ public static String getStr(String str){ BASE64Encoder base64 new BASE64Encoder(); return base64.encode(str.getBytes()); } /** * 解密 * param str * return * t…

设计模式之单件模式(Singleton Pattern)

一.单件模式是什么&#xff1f; 单件模式也被称为单例模式&#xff0c;它的作用说白了就是为了确保“该类的实例只有一个” 单件模式经常被用来管理资源敏感的对象&#xff0c;比如&#xff1a;数据库连接对象、注册表对象、线程池对象等等&#xff0c;这种对象如果同时存在多个…

asp.net中两款文本编辑器NicEdit和Kindeditor

分类&#xff1a; C#/ASP.Net 2012-10-09 22:35 665人阅读 评论(0) 收藏 举报 文本编辑asp.nettextboxserveraspsafari目录(?)[] 做过Web开发的朋友相信都使用过富文本编辑器&#xff0c;比较出名的CuteEditor和CKEditor很多人应该已经使用过&#xff0c;在功能强大的同时需要…

导出oracle awr分析报告,配置oracle内存参数,察看表空间使用率

cmd 命令生成awr报告: cmd 窗口 输入 -> Sqlplus sys/orclorcl as sysdba (sys登陆oracle).导出awr命令 ?/rdbms/admin/awrrpt.sql 3..输入导出的文件格式 为 html 回车 4输入数字1 为导出今天的分析报告 &#xff0c;2 3 。。。&#xff0c;回车 5.输入开始 snap id…

android多点触控自由对图片缩放

在系统的相册中,观看相片就可以用多个手指进行缩放.要实现这个功能,只需要这几步:1.新建项目,在项目中新建一个ZoomImage.javapublic class ZoomImageView extends View {//初始化状态常量public static final int STATUS_INIT1;//图片放大状态常量public static final int STA…

台阶问题额

题目名字 台阶问题 题意 初始化数组f的第一个元素为1。这表示到达第0级台阶的方式数为1&#xff0c;即不需要迈任何台阶。从第1级台阶开始&#xff0c;迭代计算每一级台阶的不同方式数。对于当前台阶i&#xff0c;内部循环从1到i和k中的较小值开始迭代。这是因为每次只能向上…

jboss eclipse_调试生产服务器– Eclipse和JBoss展示

jboss eclipse您是否编写有错误的代码&#xff1f; 不&#xff0c;当然不是。 对于我们其余的人&#xff0c;他们确实会编写带有bug的代码&#xff0c;我想解决一个非常敏感的问题&#xff1a;调试在生产服务器上运行的应用程序。 因此&#xff0c;您的应用程序已准备好进行部…

Chrome 控制台不完全指南

Chrome的开发者工具已经强大到没朋友的地步了&#xff0c;特别是其功能丰富界面友好的console&#xff0c;使用得当可以有如下功效&#xff1a; 更高「逼格」更快「开发调试」更强「进阶级的Frontender」Bug无处遁形「Console大法好」console.log 大家都会用log&#xff0c;但鲜…

datanucleus_DataNucleus 3.0与Hibernate 3.5

datanucleus如官方产品站点所述&#xff0c; DataNucleus Access Platform是现有的最符合标准的开源Java持久性产品。 它完全符合JDO1 &#xff0c; JDO2 &#xff0c; JDO2.1 &#xff0c; JDO2.2 &#xff0c; JDO3 &#xff0c; JPA1和JPA2 Java标准。 它还符合OGC简单功能规…

$.fn.zTree 展开 回显 选中

var ids节点字符串;// 字符串形式&#xff1a;选中节点&#xff0c;...&#xff0c;二级节点&#xff0c;根节点 var siids..split(",").length-1; var setting {view:{selectedMulti:false},data:{simpleData:{enable:true}}, async: { enab…

Android学习笔记——Menu(二)

知识点&#xff1a;这次将继续上一篇文章没有讲完的Menu的学习&#xff0c;上下文菜单(Context menu)和弹出菜单(Popup menu)。 上下文菜单上下文菜单提供对UI界面上的特定项或上下文框架的操作&#xff0c;就如同Windows中右键菜单一样。 在Android中&#xff0c;有两种提供上…

eclipse卡慢解决办法

1.设置JVM运行内存 1.1编辑eclipse.ini 1.2 编辑eclipse.ini,设置jvm运行内存参数&#xff0c;最小内存&#xff1a;物理内存*0.2&#xff0c; 最大内存&#xff1a; 物理内存*0.6&#xff1b; 其中-vmargs为必须添加参数&#xff08;-vmargs的意思是设置JVM参数&#xff09;,…

python学习之文件读写

实现文件的读写 #! /usr/bin/python file_add open(test.txt,a)for i in range(1,5): file_add.write("1.1.1.%d 255.255.255.255 %d 2.2.2.%d 255.255.255.168 \n" %(i,i,i))file_add.close() 期间遇到的问题&#xff1a; 1、字符串格式化问题—多个参数 -sh-4.1#…