题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3811

解题报告:一个无向图上有n个点和m条边,其中有k个点上安装了传感器,当有人第一次从安装了传感器的点上经过时,在控制室就会收到一个信号,现在保安制定 了一条路线目的是要将所有的点都巡逻一遍,然后在控制室收到了 L 次信号,按顺序给出收到信号的点,问这条路线是否是有可能的?

路线的不可能的情况比如收到信号的点的顺序是123,但是在无向图上要到达2这个点必定先经过3,那么这种情况就是不可能的,因为要经过2之前必定经过3,所以2之前一定会有个3.这题的思路是这样的,用dfs从第一个点开始搜,当当前点的下一个点是没有传感器的可以直接走,如果有传感器的而且刚好是路线上的下一个点,也是直接走,如果是有传感器但又不是路线上的下一个点,则先把这个点放入到一个集合里面去,当所有能走的点都走完了,再在这个集合里面找路线上的下一个点是不是在这个集合里面,最后当集合空了的时候就可以退出了,而且每次走完点之后都要标记掉。另外两个重要的就是首先要判断L 是不是等于k,因为要走完所有的点,当L小于K时,走K-L 的这些点的时候肯定会发出信号,但这些信号又不是路线上的,所以不符合。另一个是要判断这个无向图是不是个连通图,这个简单,如果不是连通图必定会有走不到的点。

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = ;
vector<int> vet[maxn];
int flag[maxn];
int T,n,m,k,l,L[maxn],cizi[maxn],visit[maxn],is[maxn],num;
void find(int p,int* is)
{
if(is[p] == ) return ;
num++;
is[p] = ;
for(int i = ;i < vet[p].size();++i)
find(vet[p][i],is);
} int is_connect(int n) //判断是否是连通图
{
num = ;
memset(is,,sizeof(is));
find(,is);
return num == n;
}
void dfs(int s,int* visit,int& p)
{
if(visit[s]) return ;
visit[s] = ;
if(flag[s]) p++;
for(int i = ;i < vet[s].size();++i)
{
int nx = vet[s][i];
if(flag[nx] && L[p+] != nx) //下一个点是有传感器的,但不是当前位置上的下一个点,则加入集合
cizi[nx] = ;
else dfs(nx,visit,p);
}
} int main()
{ scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
int a,b;
memset(flag,,sizeof(flag)); //flag[i] = 1表示i点有传感器
for(int i = ;i <= k;++i)
{
scanf("%d",&a);
flag[a] = ;
}
for(int i = ;i <= n;++i)
vet[i].clear();
for(int i = ; i<= m;++i)
{
scanf("%d%d",&a,&b);
vet[a].push_back(b);
vet[b].push_back(a);
}
scanf("%d",&l);
for(int i = ;i <= l;++i)
scanf("%d",&L[i]);
if(l != k || (!is_connect(n))) //l < k或者不是连通图
{
// if(!is_connect(n)) puts("不是连通图");
puts("No");
continue;
}
int num_cizi = ;
memset(cizi,,sizeof(cizi)); //把集合清空
memset(visit,,sizeof(visit));
cizi[L[]] = ; //路径上的第一个点加入集合
int s = L[],p = ; //当前走到的路径上的指针
while(p < l && cizi[s])
{
dfs(s,visit,p);
// printf("p = %d\n",p);
if(cizi[L[p+]] == )
s = L[p+];
else break;
}
printf(p == l? "Yes\n":"No\n");
}
return ;
}
/*
44
6 6 6
1 2 3 4 5 6
1 6
6 3
6 2
2 3
2 5
3 4
6
1 6 2 5 3 4
*/

ZOJ 3811 Untrusted Patrol的更多相关文章

  1. zoj 3811 Untrusted Patrol(bfs或dfs)

    Untrusted Patrol Time Limit: 3 Seconds      Memory Limit: 65536 KB Edward is a rich man. He owns a l ...

  2. ZOJ 3811 Untrusted Patrol The 2014 ACM-ICPC Asia Mudanjiang Regional First Round

    Description Edward is a rich man. He owns a large factory for health drink production. As a matter o ...

  3. ZOJ 3811 Untrusted Patrol【并查集】

    题目大意:给一个无向图,有些点有装监视器记录第一次到达该点的位置,问是否存在一条路径使得监视器以给定的顺序响起,并且经过所有点 思路:牡丹江网络赛的题,当时想了种并查集的做法,通神写完程序WA了几发, ...

  4. zoj3811 Untrusted Patrol (dfs)

    2014牡丹江网络赛C题 (第三水的题 The 2014 ACM-ICPC Asia Mudanjiang Regional First Round http://acm.zju.edu.cn/onl ...

  5. ZOJ 3811 / 2014 牡丹江赛区网络赛 C. Untrusted Patrol bfs/dfs/并查集

    Untrusted Patrol Time Limit: 3 Seconds                                     Memory Limit: 65536 KB    ...

  6. ZOJ 3811

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5343 网络赛这水题没写过太伤了,赛后写了下1A. 当时钻牛角尖一定要用k次bf ...

  7. The 2014 ACM-ICPC Asia Mudanjiang Regional First Round

    The Himalayas http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5341 签到 #include<cstdio& ...

  8. ZOJ People Counting

    第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ  3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...

  9. ZOJ 3686 A Simple Tree Problem

    A Simple Tree Problem Time Limit: 3 Seconds      Memory Limit: 65536 KB Given a rooted tree, each no ...

随机推荐

  1. Linux安装配置sun-java

    一(不推荐) 1. 下载源码与解压 将下载的源码包,移动到/opt目录下: $ sudo mv ~/Downloads/jdk-8u65-linux-x64.tar.gz  /opt/ 解压: $ s ...

  2. JavaWeb---总结(十四)JSP原理

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  3. 提取hdfs文件名的方法

    #!/bin/bash #------------------------------------------------------------- # 把目录中的所有文件getmerge到本地 # ...

  4. 安装vim的ycm

    环境centos 6.7 vim 7.3 安装vundle Vundle(Vim bundle)是一个Vim的插件管理器.它是把git操作整合进去,用户需要做的只是去GitHub上找到自己想要的插件的 ...

  5. CentOS7 Mini安装Oracle(图形化安装)

    以下操作在root用户下进行 1.mini版centos7没有ifconfig指令,可以如下操作 [root@localhost ~]# yum upgrade [root@localhost ~]# ...

  6. JavaWeb学习笔记——Tomcat配置

    使用的Tomcat版本是apache-tomcat-6.0.20 详细的环境变量配置参考<windows 7系统安装与配置Tomcat服务器环境> 网址为http://jingyan.ba ...

  7. thinkphp连接数据库

    版本:3.1.1 连接数据库的具体位置 thinkphp/Config/convention.php,默认修改数据库在这里就可以了 但是为了方便,把数据库配置写到Index/Conf/config.p ...

  8. CentOS与ubuntu添加eclipse桌面快捷方式的方法整理

    CentOS环境下用右键添加启动器的方式安装(ubuntu早期版本也是这样的) [1]用rmp包安装jdk, 在/usr/local目录下安装:命令 #rpm -ivh   jdk.rpm 然后#vi ...

  9. margin小结

    一. margin百分比 1. 普通元素的百分比margin都是相对于容器的宽度计算 2. 绝对定位元素的百分比margin是相对于第一个定位祖先元素(relative/absolute/fixed) ...

  10. Java并发编程核心方法与框架-CompletionService的使用

    接口CompletionService的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离.使用submit()执行任务,使用take取得已完成的任务,并按 ...