ZOJ 3811 Untrusted Patrol
题目链接: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的更多相关文章
- 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 ...
- 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 ...
- ZOJ 3811 Untrusted Patrol【并查集】
题目大意:给一个无向图,有些点有装监视器记录第一次到达该点的位置,问是否存在一条路径使得监视器以给定的顺序响起,并且经过所有点 思路:牡丹江网络赛的题,当时想了种并查集的做法,通神写完程序WA了几发, ...
- zoj3811 Untrusted Patrol (dfs)
2014牡丹江网络赛C题 (第三水的题 The 2014 ACM-ICPC Asia Mudanjiang Regional First Round http://acm.zju.edu.cn/onl ...
- ZOJ 3811 / 2014 牡丹江赛区网络赛 C. Untrusted Patrol bfs/dfs/并查集
Untrusted Patrol Time Limit: 3 Seconds Memory Limit: 65536 KB ...
- ZOJ 3811
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5343 网络赛这水题没写过太伤了,赛后写了下1A. 当时钻牛角尖一定要用k次bf ...
- The 2014 ACM-ICPC Asia Mudanjiang Regional First Round
The Himalayas http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5341 签到 #include<cstdio& ...
- ZOJ People Counting
第十三届浙江省大学生程序设计竞赛 I 题, 一道模拟题. ZOJ 3944http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=394 ...
- ZOJ 3686 A Simple Tree Problem
A Simple Tree Problem Time Limit: 3 Seconds Memory Limit: 65536 KB Given a rooted tree, each no ...
随机推荐
- 机器学习笔记—Logistic回归
本文申明:本系列笔记全部为原创内容,如有转载请申明原地址出处.谢谢 序言:what is logistic regression? Logistics 一词表示adj.逻辑的;[军]后勤学的n.[逻] ...
- stamp-po的作用
stamp-po是表示po文件是否有更新,有更新,则重新编译一次
- openssl生成https证书 (转)
1.首先要生成服务器端的私钥(key文件):openssl genrsa -des3 -out server.key 1024运行时会提示输入密码,此密码用于加密key文件去除key文件口令的命令:o ...
- 在Linux下安装和使用MySQL
[简 介] 想使用Linux已经很长时间了,由于没有硬性任务一直也没有系统学习,近日由于工作需要必须使用Linux下的MySQL.本以为有Windows下使用SQL Server的经验,觉得在Linu ...
- 表x有 一列 ,程序每次生成id的时候都先从这里获取最大值再加1,初始值是A0001,然后到A9999的时候则是到B0001 共5位
drop table x gocreate table x(id varchar(10))--insert into x values('A001')gowith a as (select ISNUL ...
- electron打包
1.全局安装electron-packager npm install -g electron-packager 2.在项目目录下执行命令 electron-packager ./ --platfor ...
- 使用ThreadLocal、Apache的dbutils的QueryRunner和dbcp2数据库连接池的BasicDataSource封装操作数据库工具
package hjp.smart4j.framework.helper; import hjp.smart4j.framework.util.CollectionUtil; import hjp.s ...
- shelve模块理解
import shelve import sys def store_person(db): pid = input("Enter unique ID mnumber:") per ...
- 详细整合教程(Spring+SpringMVC+MyBatis)
详细整合教程(Spring+SpringMVC+MyBatis) http://blog.csdn.net/gebitan505/article/details/44455235/
- Ansible简介及常用模块
一.基础介绍 1.简介 ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置. ...