zoj 3818 Untrusted Patrol(dsf+并査集+邻接表)

ZOJ Problem Set - 3811

Untrusted Patrol


Time Limit: 3 Seconds     
Memory Limit: 65536 KB



Edward is a rich man. He owns a large factory for health drink production. As a matter of course, there is a large warehouse in the factory.

To ensure the safety of drinks, Edward hired a security man to patrol the warehouse. The warehouse has
N piles of drinks and M passageways connected them (warehouse is not big enough). When the evening comes, the security man will start to patrol the warehouse following a path to check all piles of drinks.

Unfortunately, Edward is a suspicious man, so he sets sensors on K piles of the drinks. When the security man comes to check the drinks, the sensor will record a message. Because of the memory limit, the sensors can only record for the first time
of the security man‘s visit.

After a peaceful evening, Edward gathered all messages ordered by recording time. He wants to know whether is
possible that the security man has checked all piles of drinks. Can you help him?

The security man may start to patrol at any piles of drinks. It is guaranteed that the sensors work properly. However, Edward thinks the security man may not works as expected. For example, he may digs through walls, climb over piles, use some black magic
to teleport to anywhere and so on.

Input

There are multiple test cases. The first line of input is an integer T indicates the number of test cases. For each test case:

The first line contains three integers N (1 <= N <= 100000),
M (1 <= M <= 200000) and K (1 <= K <=
N).

The next line contains K distinct integers indicating the indexes of piles (1-based) that have sensors installed. The following
M lines, each line contains two integers Ai and
Bi
(1 <= Ai, Bi <=
N
) which indicates a bidirectional passageway connects piles Ai and
Bi.

Then, there is an integer L (1 <= L <= K) indicating the number of messages gathered from all sensors. The next line contains
L distinct integers. These are the indexes of piles where the messages came from (each is among the
K integers above), ordered by recording time.

Output

For each test case, output "Yes" if the security man worked normally and has checked all piles of drinks, or "No" if not.

Sample Input

2
5 5 3
1 2 4
1 2
2 3
3 1
1 4
4 5
3
4 2 1
5 5 3
1 2 4
1 2
2 3
3 1
1 4
4 5
3
4 1 2

Sample Output

No
Yes

题意:就是给你n个点,m条边,其中k个点有摄像头(只能摄到第一次出现的),然后给x个摄像头摄到人的排序,问这个人能不能,成功的把所有的点满足上面要求成功访问到所有的点

直接dfs肯定会超时,现在就是要把已经走到的点变成一个集合,这个事仿照别人写的,待会贴上自己的代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100010

int father[N],vis[N];
int head[N],n,m,k;
int a[N];
int ans;
int num;

struct stud{
int to,next;
}e[N*4];

void build(int u,int v)
{
    e[num].to=v;
    e[num].next=head[u];
    head[u]=num;
    num++;
}

int cha(int x)
{
    if(x!=father[x])
        father[x]=cha(father[x]);
    return father[x];
}

int uin(int x,int y)
{
    int xx=cha(x);
    int yy=cha(y);

    if(xx<yy)
        father[xx]=yy;
    else
        father[yy]=xx;

    return xx==yy;
}

void dfs(int x)
{
     int i;
     for(i=head[x];i!=-1;i=e[i].next)
     {
         int xx=e[i].to;
         if(!vis[xx])
         {
             if(!uin(x,xx))  //这里是我感觉关键的地方,剪纸
               dfs(xx);
         }
     }
}

int main()
{
    int t,i,j;
    scanf("%d",&t);
    while(t--)
    {
       scanf("%d%d%d",&n,&m,&k);

       for(i=1;i<=n;i++)
       {
           father[i]=i;
           head[i]=-1;
           vis[i]=0;
       }

       int x,u,v;
       i=k;
       while(i--)
       {
           scanf("%d",&x);
       }

       num=0;

       i=m;
       while(i--)
       {
           scanf("%d%d",&u,&v);
           build(u,v);
           build(v,u);
       }

       scanf("%d",&x);
       for(i=0;i<x;i++)
        {
          scanf("%d",&a[i]);
          vis[a[i]]=1;
        }

       if(x<k)  //出现了没有访问到的点(该点有摄像头却没有记录)
       {
           printf("No\n");
           continue;
       }

       if(m<n-1) //n个点至少要n-1条边相连才可能全部走到
       {
           printf("No\n");
           continue;
       }

       int flag=1;

       dfs(a[0]);
       vis[a[0]]=0;

       for(i=1;i<k;i++)
       {

            dfs(a[i]);
            vis[a[i]]=0;
           if(cha(a[i])!=cha(a[i-1]))
           {
               flag=0;
               break;
           }
       }

       if(flag==0)
       {
           printf("No\n");
           continue;
       }

       for(i=1;i<=n;i++)
        cha(i);

       for(i=1;i<=n;i++)
        if(father[i]!=father[1])
       {
            flag=0;
            break;
       }

       if(flag==0)
         printf("No\n");
       else
         printf("Yes\n");
    }
    return 0;
}

/*

2
5 5 3
1 2 4
1 2
2 3
3 1
1 4
4 5
3
4 2 1
5 5 3
1 2 4
1 2
2 3
3 1
1 4
4 5
3
4 1 2

*/
时间: 2024-10-03 14:42:17

zoj 3818 Untrusted Patrol(dsf+并査集+邻接表)的相关文章

ZOJ 3811 Untrusted Patrol【并查集】

题目大意:给一个无向图,有些点有装监视器记录第一次到达该点的位置,问是否存在一条路径使得监视器以给定的顺序响起,并且经过所有点 思路:牡丹江网络赛的题,当时想了种并查集的做法,通神写完程序WA了几发,此时JYB用BFS秒了,索性最后还是调出来了,今天自己写了下,感觉唯一的坑点就是需要遍历完所有的点 //zoj3811 #include <stdio.h> #include <string.h> #include <algorithm> #include <queu

ZOJ 3811 Untrusted Patrol bfs+并查集

题目链接:点击打开链接 题意: 给定n个点m条边的无向图,k个触发器. 下面k个数表示触发器安装在哪几个点. 下面m行给出边 最后有l个信号, 给出信号发出的触发器的顺序. 每个触发器只会发出一次信号,且一个点只有一个触发器. 有一个人在遍历图. 每经过一个点,那个点的触发器就会发出信号,问是否存在一种走法使得这个人遍历了所有点且触发器发出的信号顺序和给出的一样. 思路: 先把无触发器的点放到图里. 然后根据触发器的信号顺序把点依次加入图中,加入时只添加(与无触发器点相连的边) 然后判断这个点能

zoj 3811 Untrusted Patrol(bfs或dfs)

Untrusted Patrol Time Limit: 3 Seconds      Memory Limit: 65536 KB Edward is a rich man. He owns a large factory for health drink production. As a matter of course, there is a large warehouse in the factory. To ensure the safety of drinks, Edward hir

ZOJ 3811 Untrusted Patrol 并查集+邻接表,注意所有点都要走过

Untrusted Patrol Time Limit: 3 Seconds      Memory Limit: 65536 KB Edward is a rich man. He owns a large factory for health drink production. As a matter of course, there is a large warehouse in the factory. To ensure the safety of drinks, Edward hir

ZOJ 3811 Untrusted Patrol dfs

Untrusted Patrol Time Limit: 3 Seconds      Memory Limit: 65536 KB Edward is a rich man. He owns a large factory for health drink production. As a matter of course, there is a large warehouse in the factory. To ensure the safety of drinks, Edward hir

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 of course, there is a large warehouse in the factory. To ensure the safety of drinks, Edward hired a security man to patrol the warehouse. The warehous

ZOJ 3811 zoj 3811 Untrusted Patrol牡丹江网络赛C题

去年的比赛题目,今年才搞懂AC了===|| 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cstring> 4 #include <cctype> 5 #include <cmath> 6 #include <algorithm> 7 #include <vector> 8 #include <queue> 9 #include <stack&g

ZOJ 3811 Untrusted Patrol

题意: 一幅图某些点有监视器  监视器只记录第一次路过的时间  问  给出路线序列  是否存在满足序列的情况下遍历整幅图的点 思路: 不要想割点  割点无法处理在一个双连通分量内的多个监视器  这题就是贪心+搜索 贪心就是尽量多的使用不违背序列的点  那么我们先把序列里的第一个点和不存在监视器的点加入图  并将他们连边  对于其他的序列中的点  如果这个点存在与第一个点所形成的连通块连接的边  那么就加入这个点  否则没有答案 这里的加入点其实就是一个染色的过程  所以用搜索来搞一下 代码: #

zoj 3811 Untrusted Patrol DFS SET

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5343 当时是一个学弟过的,真心没想出来,回想起来其实可能有点后悔做ACM了,确实智商不够...... 11去牡丹江比赛,如果悲剧,ACM生涯就彻底悲剧了,尽量出结果......啥不说,专心刷题 此题还是参考了答案,,, 题目要求:按照次序访问某些点,如果能满足而且能遍历全图,输出yes否则no 学到: 1.是不是能按照规定次序,那么就这么看,按照规定次序,DFS第一个点,过程