题意:第一行给出城市数量N,公路数量M,要检查的城市数量K。
题解:该题本质是连通图问题,也就是去掉一个节点后,还剩下几个连通图,则需要修连通图个数-1条公路。
详细代码样例:
#include <bits/stdc++.h>
using namespace std;
int N,M,K;
vector <int> cityneibor[1001];
int visited [1001];
int lost;
void dfs(int cur){
visited[cur] = 1;
for(int i:cityneibor[cur]){
if(i!=lost&&!visited[i]){
dfs(i);
}
}
}
int main(){
cin>>N>>M>>K;
while(M--){
int i,j;
cin>>i>>j;
cityneibor[i].emplace_back(j);
cityneibor[j].emplace_back(i);
}
while(K--){
cin>>lost;
for(int i=1;i<=N;i++) visited[i] = 0;//0说明没有遍历过
int count=0;
for(int i=1;i<=N;i++){
if(!visited[i]&&i!=lost){
count++;
dfs(i);
}
}
cout<<count-1<<endl;
}
}
这道题难度着在于能否想到和连通图一起,并且利用深搜找到有几个连通图,也就是遍历所有节点,看需要搜几次才能搜完,说明有几个连通子图。