UESTC 686 BFS

点击打开链接

题意:问你这个人从1开始走能不能将这个图走遍,有的点是锁着的,需要对应房间的钥匙

思路:就是个BFS,不能走的点先记录下来,然后判断这里面的点有钥匙可以打开的便出来跑,直到没有这样的点为止,判断是不是所有的点都到了,判断输出即可,感觉数据有点弱.......(/ □ \)

#include <queue>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int maxn=100010;
vector<int>G[maxn];
int visclock[maxn],viskey[maxn],id[maxn],sum,vis[maxn];
queue<int>quee;
void bfs(int st){
    if(vis[st]) return ;
    queue<int>que;
    que.push(st);vis[st]=1;
    while(!que.empty()){
        int t=que.front();que.pop();
        for(unsigned int i=0;i<G[t].size();i++){
            int l=G[t][i];
            if(vis[l]==0&&visclock[l]==0){
                que.push(l);vis[l]=1;viskey[l]=0;
            }else if(visclock[l]){
                quee.push(l);
            }
        }
    }
}
int main(){
    int T,cas=1,n,m,u,v,p;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        while(!quee.empty()) quee.pop();
        memset(visclock,0,sizeof(visclock));
        memset(viskey,0,sizeof(viskey));
        memset(vis,0,sizeof(vis));
        for(int i=0;i<maxn;i++) G[i].clear();
        for(int i=0;i<m;i++){
            scanf("%d%d",&u,&v);u++;v++;
            G[u].push_back(v);
            G[v].push_back(u);
        }
        scanf("%d",&p);
        while(p--){
            scanf("%d%d",&u,&v);u++;v++;
            visclock[u]=1;viskey[v]=1;//锁着的房间和对应的钥匙
            id[u]=v;
        }
        sum=0;viskey[1]=0;
        int t=1,tmp=10;
        while(1){
            bfs(t);
            if(quee.size()==0||tmp==0) break;//没有点再进去了就结束
            tmp=0;
            int len=quee.size();
            while(len--){
                int tt=quee.front();
                if(viskey[id[tt]]==0){//这个点有钥匙开启就bfs搜一遍
                    bfs(tt);visclock[tt]=0;viskey[tt]=0;
                    tmp=1;
                    quee.pop();
                }else{
                    quee.push(tt);//没有开启的点不能扔掉
                }
            }
        }
        int flag=0;
        for(int i=1;i<=n;i++) if(vis[i]==0) flag=1;
        if(flag) printf("Case #%d: No\n",cas++);
        else printf("Case #%d: Yes\n",cas++);
    }
    return 0;
}
时间: 2024-08-30 03:37:27

UESTC 686 BFS的相关文章

UESTC 485 Game(康托,BFS)

Today I want to introduce an interesting game to you. Like eight puzzle, it is a square board with 9 positions, but it filled by 9 numbered tiles. There is only one type of valid move, which is to rotate one row or column. That is, three tiles in a r

【UESTC 482】Charitable Exchange(优先队列+bfs)

给你n个物品交换,每个交换用r,v,t描述,代表需要用r元的东西花费t时间交换得v元的东西.一开始只有1元的东西,让你求出交换到价值至少为m的最少时间代价.相当于每个交换是一条边,时间为边权,求走到价值大于等于m的点的最短路径.bfs的时候,用优先队列来储存状态,每次取出花费总时间最小的状态. #include<cstdio> #include<queue> #include<algorithm> #include<vector> #define ll lo

cdoj1088-王之迷宫 (三维迷宫最短路径)【BFS】

http://acm.uestc.edu.cn/#/problem/show/1088 王之迷宫 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 王被困在了一个3维的迷宫中,他很想逃离这个迷宫回去当学霸,你能帮助他么? 由于王很仁慈,他悄悄地告诉你,本题读入迷宫的每一行时,要用scanf("%s"...) ...... Input 多组测试

UESTC 2014 Summer Training #3 Div.2

(更新中) A:ZOJ 3611 BFS+状态压缩 [题意]:给定一张n*m的图,图上每个点有如下情况:L,R,D,U:代表在该点上只能往它已经给定的方向前进.#,W:不能走到该点.$:走到该点,可以花两分钟得到一分值,然后可以从该点向任意方向走.0:走到该点后可以向任意方向走.然后给你起点和终点坐标,问是否能从起点走到终点,如果能,求出可获得的最大分值以及与之对应达到该最大分值所需的的最小时间花 费.(其中起点和终点坐标可以相同)[知识点]:BFS+状态压缩[题解]:我觉得超级棒的题!真心感觉

CDOJ 482 Charitable Exchange bfs

Charitable Exchange Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/482 Description Have you ever heard a star charity show called Charitable Exchange? In this show, a famous star starts with a small item which val

UESTC 1143 数据传输 网络流 最大流 Dinic

数据传输 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  Status 机房里面有m台电脑,n台网线,每条网线都每秒中最多传送的数据量,如今须要你计算从标号为1的电脑传送数据到编号为m的电脑,问一秒内 最多传送多少数据? Input 第1行: 两个用空格分开的整数N(0≤N≤200)和 M(2≤M≤200).N网线的数量,M是电脑的数量. 第二行到第N+1行:

hdu 5012 bfs 康托展开

Dice Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 491    Accepted Submission(s): 290 Problem Description There are 2 special dices on the table. On each face of the dice, a distinct number w

UESTC 2014 Summer Training #6 Div.2

又是只过两水题,不过状态有些回升,也是差点一血. Problem A SPOJ AMR11A 显然的dp?就一抖就想到尝试从(R,C)推到(1,1),正着推的话,只能检查某一种解可不可行(就有人想出了二分+DP的神奇方法..刚卡过..不过上界是把所有龙加起来..不闲麻烦的话..可以按照贪心的方法先跑一个上界,就每一步选当前最优) 倒着推,龙的话,就加上,药水的话,减去?不够,和1取最大值:某一个点的f[i][j]就是两种策略取最小值: f[i][j] = min{ max(1, f[i+1][j

UVA12569-Planning mobile robot on Tree (EASY Version)(BFS+状态压缩)

Problem UVA12569-Planning mobile robot on Tree (EASY Version) Accept:138  Submit:686 Time Limit: 3000 mSec  Problem Description  Input The first line contains the number of test cases T (T ≤ 340). Each test case begins with four integers n, m, s, t (