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>
 10 using namespace std;
 11
 12 const int inf = 0x3f;
 13 const int INF = 0x3f3f3f3f;
 14 const int maxn = 100005;
 15 int N, M, K, L;
 16 bool sen[maxn], visit[maxn];
 17 int pass[maxn];
 18 int f[maxn];
 19 vector <int>G[maxn];
 20 queue <int> q;
 21
 22 int find(int x)
 23 {
 24     return x == f[x] ? x : f[x] = find(f[x]);
 25 }
 26 void Union(int x, int y)
 27 {
 28     int fx = find(x), fy = find(y);
 29
 30     if (fx == fy)
 31     {
 32         return ;
 33     }
 34
 35     if (fx > fy)
 36     {
 37         swap(fx, fy);
 38     }
 39
 40     f[fx] = fy;
 41 }
 42
 43 bool BFS(int start)
 44 {
 45     while (!q.empty())
 46     {
 47         q.pop();
 48     }
 49
 50     q.push(start);
 51
 52     visit[start] = true;
 53
 54     while (!q.empty())
 55     {
 56         int now, next;
 57         now = q.front();
 58         q.pop();
 59
 60         for (int i = 0; i < G[now].size(); i++)
 61         {
 62             next = G[now][i];
 63
 64             //printf("start = %d, next = %d\n", start, next);
 65             if (visit[next])
 66             {
 67                 continue;
 68             }
 69
 70             visit[next] = true;
 71             //如果是传感器不会入队列,但是要标记为 访问过
 72             if (sen[next])
 73             {
 74                 continue;
 75             }
 76             q.push(next);
 77         }
 78     }
 79
 80     return false;
 81 }
 82
 83 bool slove()
 84 {
 85     if(K == 0) return true;
 86     if(K != L) return false;
 87
 88     for (int i = 0; i < L - 1; i++)
 89     {
 90         BFS(pass[i]);
 91         if(!visit[pass[i+1]]) return false;
 92     }
 93     BFS(pass[L-1]);
 94
 95     for(int i = 1; i <= N; i++) //检查所有点是否都被访问了
 96         if(!visit[i])
 97             return false;
 98     return true;
 99
100 }
101 int main()
102 {
103     int t;
104     scanf("%d", &t);
105
106     while (t--)
107     {
108         memset(sen, false, sizeof(sen));
109         memset(visit, false, sizeof(visit));
110
111         int x, y, f = 0;
112         scanf("%d %d %d", &N, &M, &K);
113
114         for(int i = 1; i <= N; i++)
115             G[i].clear(); //千万不要忘记清空啊
116
117         for (int i = 0; i < K; i++)
118         {
119             scanf("%d", &x);
120             sen[x] = true;
121         }
122
123         for (int i = 0; i < M; i++)
124         {
125             scanf("%d %d", &x, &y);
126             G[x].push_back(y);
127             G[y].push_back(x);
128         }
129
130         scanf("%d", &L);
131
132         for (int i = 0; i < L; i++)
133         {
134             scanf("%d", &pass[i]);
135         }
136
137
138         if (!slove())
139         {
140             puts("No");
141         }
142         else
143         {
144             puts("Yes");
145         }
146     }
147 }

时间: 2024-10-03 23:45:59

ZOJ 3811 zoj 3811 Untrusted Patrol牡丹江网络赛C题的相关文章

ZOJ 3812 We Need Medicine(牡丹江网络赛D题)

ZOJ 3812 We Need Medicine 题目链接 思路:dp[i][j][k]表示第i个物品,组成两个值为j和k的状态,这样会爆掉,所以状态需要转化一下 首先利用滚动数组,可以省去i这维,然后由于j最大记录到50,所以可以把状态表示成一个二进制数s,转化成dp[k] = s,表示组成k状态能组成s,这样空间复杂度就可以接受了,然后这题时限还可以,就这样去转移,然后记录下路径即可 代码: #include <cstdio> #include <cstring> #incl

ZOJ 3817 Chinese Knot(牡丹江网络赛I题)

ZOJ 3817 Chinese Knot 题目链接 思路:万万没想到这题直接hash+暴力剪枝就可以了,把4个串正逆都hash出来,然后每次枚举起点去dfs记录下路径即可,剪枝为如果一旦有一点不匹配就不往后搜(这个很容易想到0 0) 代码: #include <cstdio> #include <cstring> #include <vector> #include <algorithm> using namespace std; typedef unsi

ZOJ 3814 Sawtooth Puzzle(牡丹江网络赛F题)

ZOJ 3814 Sawtooth Puzzle 题目链接 记录状态广搜,把9个拼图都压缩成一个状态,然后去搜索,就是模拟的过程比较麻烦 代码: #include <cstdio> #include <cstring> #include <queue> #include <algorithm> #include <set> using namespace std; typedef unsigned long long ll; int t; int

ZOJ 3813 Alternating Sum (牡丹江网络赛E题)

ZOJ 3813 Alternating Sum 题目链接 赛后补题中,这题真心恶心爆了 先推下公式,发现是隔一个位置,长度从最长每次减2,这样累加起来的和,然后就可以利用线段树维护,记录4个值,奇数和,偶数和,奇数答案和,偶数答案和,这样pushup的时候,对应要乘系数其实就是加上左边奇(偶)和乘上右边长度,线段树处理完,还有个问题就是查询可能横跨很多个区间,这样一来就要把区间进行分段,分成3段,然后和上面一样的方法合并即可,注意中间一段很长,不能一一去合并,可以推成等差数列,利用前n项和去搞

ZOJ-3811 Untrusted Patrol DFS 2014牡丹江网络赛C题

n个点,m条双向边,k个传感器.其中有l个传感器记录到了第一次到达的时间顺序,求是否有可能检查了所有的顶点. 首先判断l,l<k一定是不行的.然后按照传感器的时间顺序dfs,先从第一个传感器位置搜索dfs搜到所有的到达传感器的位置结束,如果这个传感器被标记为可访问,则从这个传感器继续搜索下一层传感器,否则是不能满足时间顺序的.最后还要判断整个图的连通性,所有的顶点都要可以到达的. #include <iostream> #include <cstdio> #include &

【瞎搞】ZOJ 3818 Pretty Poem 牡丹江网络赛J题

第一种情况:ABABA. 先判断开头的A与结尾的A,得到A的长度,接着判断ABAB 中的AB与AB是否相同(ABAB的长度一定为偶数) 已经知道了A长度,AB的长度 接着判断下A 与B是否相同 第二种情况:ABABCAB-可先讲AB看成整体即DDCD 若存在一个D满足条件 可得到C的长度和位置再判断A-B是否相同A-C是否相同 B-C是否相同(暴力取A的长度咯) #include <stdio.h> #include <string.h> #include <stdlib.h

ACM学习历程——ZOJ 3829 Known Notation (2014牡丹江区域赛K题)(策略,栈)

Description Do you know reverse Polish notation (RPN)? It is a known notation in the area of mathematics and computer science. It is also known as postfix notation since every operator in an expression follows all of its operands. Bob is a student in

zoj 3829 Known Notation(2014年牡丹江区域赛k题)

Known Notation Time Limit: 2 Seconds      Memory Limit: 131072 KB Do you know reverse Polish notation (RPN)? It is a known notation in the area of mathematics and computer science. It is also known as postfix notation since every operator in an expre

zoj 3827 Information Entropy(2014牡丹江区域赛I题)

Information Entropy Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge Information Theory is one of the most popular courses in Marjar University. In this course, there is an important chapter about information entropy. Entropy is t