因为PAT的题目数据普遍实在太弱,看到题目就想暴力,这题也是
1)对于孤立的点不管,肯定不会影响联通性
2)其他点直接每次dfs出有几个联通块,如果删除这个点后联通块数目改变了,说明要发出红色警报。但是要注意一点,当原连通图删的只剩下几个孤立的点后,删一个点,联通块就少一个,此时不发警报。
各位大神如果有更好的解法恳求指点一二
/* ***********************************************
Author :angon
************************************************ */
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define REP(i,k,n) for(int i=k;i<n;i++)
#define REPP(i,k,n) for(int i=k;i<=n;i++)
#define scan(d) scanf("%d",&d)
#define scann(n,m) scanf("%d%d",&n,&m)
#define mst(a,k) memset(a,k,sizeof(a));
#define LL long long
#define maxn 1005
#define mod 100000007
/*
inline int read()
{
int s=0;
char ch=getchar();
for(; ch<'0'||ch>'9'; ch=getchar());
for(; ch>='0'&&ch<='9'; ch=getchar())s=s*10+ch-'0';
return s;
}
inline void print(int x)
{
if(!x)return;
print(x/10);
putchar(x%10+'0');
}
*/
struct node
{
int to,next;
}edge[50005];
int head[505],tot;
void addedge(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
}
int vis[505],vis2[505],cnt,has[505];
void dfs(int u)
{
if(vis2[u]) return ;
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if(vis[v]||vis2[v]) continue;
vis[v]=1;
dfs(v);
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n,m,k;
scann(n,m);
mst(head,-1);mst(vis2,0); mst(has,0);tot=0;
REP(i,0,m)
{
int u,v;
scann(u,v);
has[u]=has[v]=1;
addedge(u,v);
addedge(v,u);
}
mst(vis,0); cnt=0;
REP(i,0,n)
{
if(!vis[i] && has[i])
{
cnt++;
dfs(i);
}
}
scan(k);
int cnt2=0;
REP(i,0,k)
{
//printf("cnt=%d\n",cnt);
int u; scan(u);
if(!has[u])
{
printf("City %d is lost.\n",u);
continue;
}
cnt2=0;
mst(vis,0);
vis2[u]=vis[u]=1;
REP(j,0,n)
{
if(!vis[j] && !vis2[j] && has[j])
{
// printf("%d\n",j);
cnt2++;
dfs(j);
}
}
//printf("%d ",cnt2);
if(cnt2!=cnt && cnt2!=cnt-1)
{
printf("Red Alert: City %d is lost!\n",u);
cnt=cnt2;
}
else if(cnt2==cnt-1)
{
printf("City %d is lost.\n",u);
cnt=cnt2;
}
else
printf("City %d is lost.\n",u);
}
if(k==n) printf("Game Over.\n");
return 0;
}