UESTC 1811 Hero Saving Princess
九野的博客,转载请注明出处 http://blog.csdn.net/acmmmm/article/details/11104265
题目链接 :http://222.197.181.5/problem.php?pid=1811
题意:T个测试数据
n m //n个点 m条边
m条无向边
que//下面有que个数据
a b // 表示a点的钥匙在b中
问,从0点开始能否遍历所有的点
思路:用BFS搜一遍即可,注意图是否连通,用并查集判断一下
BFS()时,q为正常队列,p为走到那个点是锁住时将q中点移到p中
#include <iostream>
#include <string>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <stdlib.h>
#include <cstdlib>
#include <math.h>
#include <cstring>
#include <set>
#include <vector>
#define inf 1073741824
#define N 100100
#define ll int
using namespace std;
inline ll Max(ll a,ll b){return a>b?a:b;} int lock[N],key[N],n,m;//lock=0表示没锁 ,key[i] 表示i房间中的钥匙,没有钥匙=-1
vector<int>G[N];
queue<int>q,p;//q表示bfs的没锁的点,p表示被锁的点 int f[N];
int find(int x){
if(f[x]==x)return x;
return f[x]=find(f[x]);
} bool vis[N],inp[N]; void BFS(){
memset(vis,0,sizeof(vis));
memset(inp,0,sizeof(inp));
q.push(0);
vis[0]=true;
int i,v,u,len;
bool change=true; while(1)
{
change=false;//跳出条件是有新的点可以走
while(!q.empty())
{
u=q.front(); q.pop();
len=G[u].size();
for(i=0;i<len;i++)
{
v=G[u][i];
if(lock[v]==-1)
{
if(inp[v]==false)
p.push(v),inp[v]=true;//如果锁着且不在p中
continue;
}
if(vis[v]==false)
{
vis[v]=true;
q.push(v);
change=true;
if(key[v]!=-1)//说明有钥匙
lock[key[v]]=0;
}
}
}
if(change==false)break;
if(!p.empty())
{
len=p.size();
while(len--)
{
int u=p.front();p.pop();
if(lock[u]>=0) //u点没有锁
q.push(u),vis[u]=true;
else p.push(u);
}
} }
} int main(){
int i,j,a,b,que;
int T,Cas=1;scanf("%d",&T); while(T--){
memset(lock,0,sizeof(lock));
memset(key,-1,sizeof(key));
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)G[i].clear(),f[i]=i; while(m--)
{
scanf("%d%d",&a,&b);
G[a].push_back(b);
G[b].push_back(a);
f[find(a)]=find(b);
}
scanf("%d",&que);
while(que--)
{
scanf("%d%d",&b,&a);
key[a]=b;
lock[b]=-1;
} for(i=0;i<n;i++)find(i);
bool fu=false;
for(i=0;i<n;i++)
if(f[i]!=f[0])
{
fu=true;
break;
}
if(fu){printf("Case #%d: No\n",Cas++);continue;} while(!q.empty())q.pop();
while(!p.empty())p.pop();
if(key[0]!=-1)lock[key[0]]=0;//起点房间如果有钥匙直接开门
BFS();
if(!p.empty())printf("Case #%d: No\n",Cas++);//p表示锁着的门,如果还有锁着的门就说明没有走到所有的点
else printf("Case #%d: Yes\n",Cas++);
}
return 0;
}
/*
99
2 1
0 1
0
3 2
0 1
1 2
1
1 2 7 9
0 1
2 0
2 5
5 1
5 6
5 2
1 3
3 6
1 4
3
4 2
2 0
6 4 7 9
0 1
2 0
2 5
5 1
5 6
5 2
1 3
3 6
1 4
1
2 2 3 4
0 1
1 0
0 1
2 0
2
1 2
2 1 1 0
0 2 1
1 0
1
1 1 2 1
1 0
1
1 0 2 0
0 ans:
y
n
y
n
n
y
n
y */
UESTC 1811 Hero Saving Princess的更多相关文章
- 2012 #1 Saving Princess claire_
Saving Princess claire_ Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- hdu----(4308)Saving Princess claire_(搜索)
Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- hdu 4308 Saving Princess claire_
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Description Princess cla ...
- HDU 4308 BFS Saving Princess claire_
原题直通车:HDU 4308 Saving Princess claire_ 分析: 两次BFS分别找出‘Y’.‘C’到达最近的‘P’的最小消耗.再算出‘Y’到‘C’的最小消耗,比较出最小值 代码: ...
- Saving Princess claire_(hdu 4308 bfs模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Jav ...
- ZOJ 3369 Saving Princess
Saving Princess Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on ZJU. Origina ...
- hdu 4308 Saving Princess claire_ BFS
为了准备算法考试刷的,想明确一点即可,全部的传送门相当于一个点,当遇到一个传送门的时候,把全部的传送门都压入队列进行搜索 贴代码: #include <iostream> #include ...
- HDU 4308 Saving Princess claire_(简单BFS)
求出不使用P点时起点到终点的最短距离,求出起点到所有P点的最短距离,求出终点到所有P点的最短距离. 答案=min( 不使用P点时起点到终点的最短距离, 起点到P的最短距离+终点到P的最短距离 ) #i ...
- BFS(最短路) HDOJ 4308 Saving Princess claire_
题目传送门 题意:一个(r*c<=5000)的迷宫,起点'Y‘,终点'C',陷阱‘#’,可行路‘*’(每走一个,*cost),传送门P,问Y到C的最短路 分析:一道最短路问题,加了传送门的功能, ...
随机推荐
- 内核与ramdisk到底是什么关系
转自:http://www.lupaworld.com/forum.php?mod=viewthread&tid=61425 原名:内核与ramdisk到底是什么关系? 个人Notes: ...
- JAVA内存区域和GC机制
目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...
- rhel6.4 using centos source
rhel 默认的 yum 依赖于 rhn,要注册收费才能 update,改用 centos 的源: rpm -e yum* --nodeps rpm -qa | grep yum | xargs rp ...
- new的原理
先来个构造函数的例子: function Prince(name,age){ this.name=name; this.age=age; } var prince=new Prince("c ...
- C#SaveFileDialog的使用
SaveFileDialog sfd = new SaveFileDialog(); //默认打开的路径 sfd.InitialDirectory = "C:\\Users\\Adminis ...
- nginx 配置文件解析(一)
nginx.conf user nginx; # nginx服务的运行用户 worker_processes ; # 启动进程数,通常设置成和CPU的数量相等 error_log /var/log/n ...
- ajax初学
//参数说明url:请求文件地址//fnSucc:请求成功执行的函数,请求成功的条件为readyState状态码为4:且status状态码为200,status状态为浏览器请求返回的状态码//在fnS ...
- PHPExcel用法有感
今日项目需求导出excel.我用最简单的header头方式导出了,但是需求部门退回了,说不满足他们的需求,需要我按照他们的模板来导出. 然后想到了PHPExcel,没用过,走了不少弯路. 1.去官网下 ...
- win7安装memcached
根据公司业务需求,需要用memcache缓存,正好接触一下,在win7下配置安装: 1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached 2. 在终端(也 ...
- Python Udp Socket
socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...