九野的博客,转载请注明出处 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. 自定义控件 闪烁效果的TextView

    使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android ...

  2. .NET基础拾遗(7)多线程开发基础1

    一.多线程编程的基本概念 1.1 操作系统层面的进程和线程 (1)进程 进程代表了操作系统上运行着的一个应用程序.进程拥有自己的程序块,拥有独占的资源和数据且可以被操作系统调度. But,即使是同一个 ...

  3. (五)《Java编程思想》——final关键字

    可能使用final的三种情况:数据.方法.类. 1.final数据 final 常量必须是基本类型数据,且在定义时须赋值: 一个既是static又是final的域只占据一段不能改变的存储空间,只有一份 ...

  4. 详细介绍ASP.NET页面重定向方法

    ASP.NET中页面重定向的使用的很频繁,实现方法也有不同,自己也试过几种,现在总结一下. 一.Transfer Execute Redirect重定向方法介绍 1.Server.Transfer方法 ...

  5. Jenkins学习之——(1)Jenkins的安装与配置

    1.最近公司要求做自动化部署,于是自学了jenkins.这个参考书很少,网上的文章也讲得很模糊,于是打算把自己学习东西记下来,希望对大家有所帮助. 一.jenkins的安装 到jenkins官网(ht ...

  6. AsyncTask api

    package com.bf.systemadmin;import android.os.AsyncTask;import android.util.Log;public class MyTask e ...

  7. FANTASY:In which way do you think the world will end?

    In which way do you think the world will end? The moment you are reading my essay, you are somehow c ...

  8. 网站的优化----首页优化---app调取服务端数据

    高并发经常会发生在有大活跃用户量来访问网站的某个点,例如用户高聚集的业务场景中,如:抢购,促销等.为了让用户流畅的访问网站,来根据自己的业务设计适合系统的处理方案. //对于APP网站首页数据,通常是 ...

  9. Linux编程遇到的问题汇集(持续更新中)

    1.源代码编译redis报告错误: undefined reference to `__sync_add_and_fetch_4' 最近项目组在实验Redis,源代码编译的时候,遇到了错误:undef ...

  10. 百度PHP实习一面面试题-算法-二维有序矩阵的查找

    题目描述 有一个二维矩阵,每一行的元素,从左到右保持严格递增,每一列的元素,从上到下保持严格递增.查找给定元素elem,返回NULL或元素位置. 1 3 7 15 16 2 5 8 17 19 3 6 ...