输入样例:
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.
该题需要注意的是,在当深搜或广搜求得连通块数量时,只有数量增加才发出警报,否则不发出警报即可,而并非改变就发出警报,我就是陷入了这个误区。。。
由于被攻占城市不重复,所以当城市数量等于K时输出game over。
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
vector<int> Adj[505];
int vis[505],n;
int lost[505];
void dfs(int s) {
for(int i=0; i<Adj[s].size(); i++) {
if(vis[Adj[s][i]]==false&&lost[Adj[s][i]]==false)
{
vis[Adj[s][i]]=true;
dfs(Adj[s][i]);
}
}
}
int main() {
int m;
cin>>n>>m;
for(int i=0; i<m; i++) {
int a,b;
cin>>a>>b;
Adj[a].push_back(b);
Adj[b].push_back(a);
}
int k,preliantong=0;
cin>>k;
for(int i=0;i<n;i++)
{
if(vis[i]==false&&lost[i]==false)
{
dfs(i);
preliantong++;
}
}
// cout<<"原始:"<<preliantong<<endl;
fill(vis,vis+n,0);
for(int i=0; i<k; i++) {
int liantong=0;
int a;
cin>>a;
lost[a]=true;
for(int j=0; j<n; j++) {
if(lost[j]==false&&vis[j]==false) {
// cout<<j<<'*';
dfs(j);
liantong++;
}
}
if(liantong<=preliantong) {
printf("City %d is lost.\n",a,liantong);
} else {
printf("Red Alert: City %d is lost!\n",a,liantong);
}
preliantong=liantong;
fill(vis,vis+n,0);
}
if(k==n)cout<<"Game Over.";
}