思考一下的话这道题其实考的是有多少个连通块,所以用dfs或者bfs都是可以的,道路数等于连通块个数减1。想要将某个结点视作断掉,就先将他的vis数组置为true,这样dfs时碰到他就会绕开了。
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
const int maxv=1010;
vector<int> gra[maxv];
bool vis[maxv];
void dfs(int s){
vis[s]=true;
for(int i=0;i<gra[s].size();i++){
if(vis[gra[s][i]]==false){
dfs(gra[s][i]);
}
}
return;
}
int main(){
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<m;i++){
int v1,v2;
cin>>v1>>v2;
gra[v1].push_back(v2);
gra[v2].push_back(v1);
}
for(int i=0;i<k;i++){
int id;
cin>>id;
int block=0;
memset(vis,false,sizeof(vis));
vis[id]=true;
for(int j=1;j<=n;j++){
if(vis[j]==false){
dfs(j);
block++;
}
}
cout<<block-1<<endl;
}
return 0;
}