L2-013 红色警报 (25 分)
战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的k个区域,而失去一个城市并不改变其他城市之间的连通性,则不要发出警报。
输入格式:
输入在第一行给出两个整数N
(0 < N
≤ 500)和M
(≤ 5000),分别为城市个数(于是默认城市从0到N
-1编号)和连接两城市的通路条数。随后M
行,每行给出一条通路所连接的两个城市的编号,其间以1个空格分隔。在城市信息之后给出被攻占的信息,即一个正整数K
和随后的K
个被攻占的城市的编号。
注意:输入保证给出的被攻占的城市编号都是合法的且无重复,但并不保证给出的通路没有重复。
输出格式:
对每个被攻占的城市,如果它会改变整个国家的连通性,则输出Red Alert: City k is lost!
,其中k
是该城市的编号;否则只输出City k is lost.
即可。如果该国失去了最后一个城市,则增加一行输出Game Over.
。
输入样例:
5 4
0 1
1 3
3 0
0 4
5
1 2 0 4 3
输出样例:
City 1 is lost.
City 2 is lost.
Red Alert: City 0 is lost!
City 4 is lost.
City 3 is lost.
Game Over.
没什么好说的 PTA特色题目 搜就完事了 搞两次BFS 还有一次判断 数据量还好 不是特别扯淡
GAMEOVER 一开始我写在了注释掉的地方 实际上K<N 的时候不用输出它
1 using namespace std; 2 #include <stdio.h> 3 #include <iostream> 4 #include <cstring> 5 #include <vector> 6 #include <queue> 7 #include <sstream> 8 #include <algorithm> 9 int N, M, K; 10 11 const int si = 505; 12 //bfs扫描连通块数量 13 vector<int> G[si]; 14 bool banned[si], vis[si]; 15 queue <int > q; 16 17 void bfs(int crt) { 18 q.push(crt); 19 vis[crt] = 1; 20 while (!q.empty()) { 21 int x = q.front(); q.pop(); 22 for (int i = 0; i < G[x].size(); i++) { 23 int to = G[x][i]; 24 if (vis[to]) continue; 25 vis[to] = 1; 26 q.push(to); 27 } 28 } 29 } 30 31 void bfs2(int crt) { 32 q.push(crt); 33 vis[crt] = 1; 34 while (!q.empty()) { 35 int x = q.front(); q.pop(); 36 for (int i = 0; i < G[x].size(); i++) { 37 int to = G[x][i]; 38 if (vis[to] || banned[to]) continue; 39 vis[to] = 1; 40 q.push(to); 41 } 42 } 43 } 44 bool judgesingle(int crt) { 45 for (int i = 0; i < G[crt].size(); i++) { 46 int to = G[crt][i]; 47 if (!banned[to]) return false; 48 } 49 return true; 50 } 51 int main() { 52 cin >> N >> M; 53 for (int i = 0; i < M; i++) { 54 int a, b; 55 cin >> a >> b; 56 G[a].push_back(b); 57 G[b].push_back(a); 58 } 59 cin >> K; 60 int blocks = 0; 61 for (int i = 0; i < N; i++) { 62 if (!vis[i]) { 63 bfs(i); 64 blocks++; 65 } 66 } 67 for (int i = 0, ban; i < K; i++) { 68 cin >> ban; 69 banned[ban] = 1; 70 int bl = 0; 71 fill(vis, vis + si, 0); 72 for (int j = 0; j < N; j++) { 73 if (!vis[j] && !banned[j]) { 74 bfs2(j); 75 bl++; 76 } 77 } 78 if (bl != blocks) { 79 if (judgesingle(ban)) printf("City %d is lost.", ban); 80 else printf("Red Alert: City %d is lost!", ban); 81 } 82 else { 83 printf("City %d is lost.", ban); 84 } 85 blocks = bl; 86 cout << endl; 87 if (i >= N - 1) cout << "Game Over." <<endl; 88 } 89 //cout << "Game Over." <<endl; 90 return 0; 91 }