题目链接:点击打开链接
题目大意:略。
解题思路:注意每次 pre(原始连通个数)都需要被更新。
AC 代码
#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a)
#define ssclr(ss) ss.clear(), ss.str("")
#define INF 0x3f3f3f3f
#define MOD 1000000007
using namespace std;
typedef long long ll;
int n;
int vis[520];
int g[520][520];
vector<int> vec;
void dfs(int s)
{
vis[s]=1;
for(int i=0;i<n;i++)
if(!vis[i] && g[s][i]) dfs(i);
}
int fun()
{
int cnt=0;
mem(vis,0);
for(int i=0;i<vec.size();i++)
vis[vec[i]]=1;
for(int i=0;i<n;i++)
{
if(!vis[i]) dfs(i), cnt++;
}
return cnt;
}
int main()
{
int m,u,v,q,cur;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
g[u][v]=g[v][u]=1;
}
int pre=fun();
scanf("%d",&q);
for(int i=0;i<q;i++)
{
scanf("%d",&u);
vec.push_back(u);
cur=fun();
if(cur<=pre) printf("City %d is lost.\n",u);
else printf("Red Alert: City %d is lost!\n",u);
pre=cur;
}
if(q==n) puts("Game Over.");
return 0;
}