网上说这是在考查并查集的相关算法
而我是用dfs暴力解决的(差点超时)
int isConnect(){
int repair=0;
for(int i=1;i<=n;i++){
if(i!=c&&connect[i]==0)
repair++;
dfs(i);
}
return repair-1;
}
---------------------------------------------
#include <iostream>
using namespace std;
int map[1001][1001];
int emap[1001][1001];
int city[1001];
int connect[1001];
int n, m, k, c;
void init(){
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++)
map[i][j]=emap[i][j]=0;
city[i]=0;
connect[i]=0;
}
}
void occupy(int x){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
emap[i][j]=map[i][j];
for(int i=1;i<=n;i++)
emap[x][i]=emap[i][x]=0;
}
void dfs(int a){
for(int i=1;i<=n;i++){
if(i!=c&&i!=a&&emap[a][i]==1&&connect[i]==0){
connect[i]=1;
dfs(i);
}
}
}
int isConnect(){
int repair=0;
for(int i=1;i<=n;i++){
if(i!=c&&connect[i]==0)
repair++;
dfs(i);
}
return repair-1;
}
int main()
{
int i;
cin>>n>>m>>k;
init();
i=m;
while(i--){
int a,b;
cin>>a>>b;
map[a][b]=map[b][a]=1;
}
i=0;
while(i<k){
int a;
cin>>a;
city[i]=a;
i++;
}
for(i=0;i<k;i++){
occupy(city[i]);
c=city[i];
cout<<isConnect()<<endl;
for(int j=1;j<=n;j++)
connect[j]=0;
}
return 0;
}