PAT L2-013. 红色警报
原题链接
简单
作者:
青丝蛊
,
2021-04-10 12:08:01
,
所有人可见
,
阅读 213
#include <bits/stdc++.h>
using namespace std;
const int N = 510;
vector<int> v[N];
int n, m;
bool vis[N];
void dfs(int x)
{
vis[x] = true;
for (auto c : v[x]) if (!vis[c]) dfs(c);
}
int main()
{
cin >> n >> m;
while (m--)
{
int a, b; cin >> a >> b;
v[a].push_back(b);
v[b].push_back(a);
}
cin >> m;
vector<int> a; // 存攻占过的城市
for(int i = 0; i < m; i++)
{
int x;
cin >> x;
int cnt1 = 0, cnt2 = 0; // 攻占前与攻占后的连通分量
memset(vis,false,sizeof vis);
for(auto c:a) vis[c]=true;
for (int i = 0; i < n; i++) if (!vis[i]) cnt1++, dfs(i);
a.push_back(x);
memset(vis,false,sizeof vis);
for(auto c:a) vis[c]=true;
for (int i = 0; i < n; i++) if (!vis[i]) cnt2++, dfs(i);
// 如果连通分量增加了
if (cnt2 > cnt1) printf("Red Alert: City %d is lost!\n", x);
else printf("City %d is lost.\n", x);
}
if(m == n) puts("Game Over.");
/*
最后判断有无存活的城市是不对的,因为最后一次求连通分量时,把所有城市都遍历了
bool flog = false;
for (int i = 0; i < n; i++) if (!vis[i]) flog = true;
if (!flog) puts("Game Over.");
*/
return 0;
}