题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805063963230208
题意:给n个顶点,m条边,问每次删除一个点会不会破坏图的连通性。
思路:用dfs/bfs求图的连通分量个数,每次求出删除点之前和之后的连通分量数cnt、cnt1,若cnt1>cnt+1,则破坏了连通性;否则就没有破坏连通性。
AC代码:
#include<bits/stdc++.h>
using namespace std; int n,m,k,t1,t2,cnt,cnt1;
int a[][],vis[];
queue<int> q; void bfs(int p){
q.push(p);
while(!q.empty()){
int nw=q.front();
q.pop();
for(int i=;i<n;++i)
if(!vis[i]&&a[nw][i]){
vis[i]=;
q.push(i);
}
}
} int getc(){
int res=;
memset(vis,,sizeof(vis));
for(int i=;i<n;++i)
if(!vis[i]){
vis[i]=;
++res;
bfs(i);
}
return res;
} int main(){
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d",&t1,&t2);
a[t1][t2]=a[t2][t1]=;
}
cnt=getc();
scanf("%d",&k);
for(int i=;i<=k;++i){
scanf("%d",&t1);
for(int j=;j<n;++j)
a[t1][j]=a[j][t1]=;
cnt1=getc();
if(cnt1>cnt+)
printf("Red Alert: City %d is lost!\n",t1);
else
printf("City %d is lost.\n",t1);
if(i==n)
printf("Game Over.\n");
cnt=cnt1;
}
return ;
}