九野的博客,转载请注明出处 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的更多相关文章

  1. 2012 #1 Saving Princess claire_

    Saving Princess claire_ Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  2. hdu----(4308)Saving Princess claire_(搜索)

    Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/ ...

  3. hdu 4308 Saving Princess claire_

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Description Princess cla ...

  4. HDU 4308 BFS Saving Princess claire_

    原题直通车:HDU 4308 Saving Princess claire_ 分析: 两次BFS分别找出‘Y’.‘C’到达最近的‘P’的最小消耗.再算出‘Y’到‘C’的最小消耗,比较出最小值 代码: ...

  5. Saving Princess claire_(hdu 4308 bfs模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Jav ...

  6. ZOJ 3369 Saving Princess

    Saving Princess Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on ZJU. Origina ...

  7. hdu 4308 Saving Princess claire_ BFS

    为了准备算法考试刷的,想明确一点即可,全部的传送门相当于一个点,当遇到一个传送门的时候,把全部的传送门都压入队列进行搜索 贴代码: #include <iostream> #include ...

  8. HDU 4308 Saving Princess claire_(简单BFS)

    求出不使用P点时起点到终点的最短距离,求出起点到所有P点的最短距离,求出终点到所有P点的最短距离. 答案=min( 不使用P点时起点到终点的最短距离, 起点到P的最短距离+终点到P的最短距离 ) #i ...

  9. BFS(最短路) HDOJ 4308 Saving Princess claire_

    题目传送门 题意:一个(r*c<=5000)的迷宫,起点'Y‘,终点'C',陷阱‘#’,可行路‘*’(每走一个,*cost),传送门P,问Y到C的最短路 分析:一道最短路问题,加了传送门的功能, ...

随机推荐

  1. 内核与ramdisk到底是什么关系

    转自:http://www.lupaworld.com/forum.php?mod=viewthread&tid=61425 原名:内核与ramdisk到底是什么关系? 个人Notes:    ...

  2. JAVA内存区域和GC机制

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

  3. rhel6.4 using centos source

    rhel 默认的 yum 依赖于 rhn,要注册收费才能 update,改用 centos 的源: rpm -e yum* --nodeps rpm -qa | grep yum | xargs rp ...

  4. new的原理

    先来个构造函数的例子: function Prince(name,age){ this.name=name; this.age=age; } var prince=new Prince("c ...

  5. C#SaveFileDialog的使用

    SaveFileDialog sfd = new SaveFileDialog(); //默认打开的路径 sfd.InitialDirectory = "C:\\Users\\Adminis ...

  6. nginx 配置文件解析(一)

    nginx.conf user nginx; # nginx服务的运行用户 worker_processes ; # 启动进程数,通常设置成和CPU的数量相等 error_log /var/log/n ...

  7. ajax初学

    //参数说明url:请求文件地址//fnSucc:请求成功执行的函数,请求成功的条件为readyState状态码为4:且status状态码为200,status状态为浏览器请求返回的状态码//在fnS ...

  8. PHPExcel用法有感

    今日项目需求导出excel.我用最简单的header头方式导出了,但是需求部门退回了,说不满足他们的需求,需要我按照他们的模板来导出. 然后想到了PHPExcel,没用过,走了不少弯路. 1.去官网下 ...

  9. win7安装memcached

    根据公司业务需求,需要用memcache缓存,正好接触一下,在win7下配置安装: 1. 下载memcache的windows稳定版,解压放某个盘下面,比如在c:\memcached 2. 在终端(也 ...

  10. Python Udp Socket

    socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...