L2-013 红色警报 (dfs判断图连通性)
L2-013 红色警报
战争中保持各个城市间的连通性非常重要。本题要求你编写一个报警程序,当失去一个城市导致国家被分裂为多个无法连通的区域时,就发出红色警报。注意:若该国本来就不完全连通,是分裂的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.
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<vector>
5 #include<queue>
6 #include<stack>
7 #include<cmath>
8 #include<set>
9 #include<algorithm>
10 using namespace std;
11 int mp[510][510];
12 int n,m;
13 int k,x,y;
14 int vis[510];
15 void dfs(int x)
16 {
17 for(int i=0;i<n;i++)
18 {
19 if(mp[x][i]==1&&vis[i]==0)
20 {
21 vis[i]=1;
22 dfs(i);
23 }
24 }
25 }
26 int count()
27 {
28 memset(vis,0,sizeof(vis));
29 int cnt=0;
30 for(int i=0;i<n;i++)
31 {
32 if(!vis[i])
33 {
34 vis[i]=1;
35 dfs(i);
36 cnt++;
37 }
38
39 }
40 return cnt;
41 }
42 int main()
43 {
44 scanf("%d%d",&n,&m);
45 for(int i=0;i<m;i++)
46 {
47 scanf("%d%d",&x,&y);
48 mp[x][y]=1;
49 mp[y][x]=1;
50 }
51 scanf("%d",&k);
52 int sum=count();
53 for(int j=0;j<k;j++)
54 {
55 scanf("%d",&x);
56 for(int i=0;i<n;i++)
57 {
58 mp[i][x]=0;
59 mp[x][i]=0;
60 }
61 int tmp=count();
62 if(tmp>sum+1)
63 printf("Red Alert: City %d is lost!\n",x);
64 else
65 printf("City %d is lost.\n",x);
66 sum=tmp;
67 if(j==n-1)
68 puts("Game Over.");
69 }
70 }