就是找去掉一点后连通分量个数,用DFS,并查集都可以。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <set>
int n,m,k;
int mat[1001][1001];
int visit[1001];
void dfs(int from){
int i;
for(i=1;i<=n;i++){
if( visit[i]==0 && mat[from][i]==1){
visit[i]=1;
dfs(i);
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
int i,j;
memset(mat,0,sizeof(mat));
while(m--){
scanf("%d%d",&i,&j);
mat[i][j] = mat[j][i] =1;
}
int city;
while(k--){
scanf("%d",&city);
memset(visit,0,sizeof(visit));
visit[city]=1;
int cnt=0;
for(int i=1;i<=n;i++){
if(visit[i]==0){
cnt++;
dfs(i);
}
}
printf("%d\n",cnt-1);
}
return 0;
}
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <set>
#define N 1001
int Tree[1001];
int findRoot(int x){
if(Tree[x] == -1)
return x;
else{
int tmp=findRoot(Tree[x]);
Tree[x]=tmp;
return tmp;
}
}
struct Edge{
int a,b;
}edge[500000];
int main(){
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
int a,b;
for(int i=1;i<=m;i++){
scanf("%d%d",&edge[i].a,&edge[i].b);
}
int def;
while(k--){
//printf("k=%d\n",k);
for(int i=1;i<=n;i++)
Tree[i]=-1;
scanf("%d",&def);
Tree[def]=1;
for(int i=1;i<=m;i++){
if(edge[i].a!=def && edge[i].b!=def){
a=findRoot(edge[i].a);
b=findRoot(edge[i].b);
if(a!=b){
Tree[b]=a;
}
}
}
int cnt=0;
for(int i=1;i<=n;i++){
if(Tree[i]==-1 && i!=def)
cnt++;
}
printf("%d\n",cnt-1);
}
return 0;
}