错误原因:
数据结构使用错误,一看到城市,分裂,连通就想用割点,但是割点我只得了2分,
后来想想不是简单的割点,因为随着点的删除,图形也发生变化,原来简单的点也可能变为割点,
比如下图:
思路:
所以可以用图的遍历来做,每次删除一个点,然后扫描这个点所在的连通区间,判断这个连通区间是否还连通。
反思:
考虑割点变化同时连通分量的个数也会发生变化,所以不能用发生变化的量来判断结果。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn = 100100;
int bj[maxn]={0},vis[maxn];
vector <int> vc[maxn];
void dfs(int x)
{
for(int i=0;i<vc[x].size();i++){
int y=vc[x][i];
if(!vis[y]&&!bj[y]){
vis[y]=1;
dfs(y);
}
}
}
int main(void)
{
int n,m,i,j,x,y;
int t1,t2;
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d",&x,&y);
vc[x].push_back(y);
vc[y].push_back(x);
}
int k;
scanf("%d",&k);
for(j=0;j<k;j++){
scanf("%d",&x);
bj[x]=1;
int tp=0;
memset(vis,0,sizeof(vis));vis[x]=1;
for(i=0;i<vc[x].size();i++){
y=vc[x][i];
if(bj[y]==0&&vis[y]==0){
vis[y]=1;dfs(y);tp++;
}
}
if(tp>=2) printf("Red Alert: City %d is lost!\n",x);
else printf("City %d is lost.\n",x);
if(j==n-1) printf("Game Over.\n");
}
return 0;
}