该测试点是多个城市一开始就不通的情况,如下:
5 1 5
1 2
1 2 3 4 5
所以如果只是遍历被占领城市周边城市的话会出现有几个城市没有被遍历的情况例如:
for(int i=0;i<mp[x].size();i++){
if(!flag[mp[x][i]]){
ans++;
}
q.push(mp[x][i]);
} //可能会有几个城市没有搜索到
所以需要每一个城市都遍历过去,ac代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,k,x1,x2;
vector<int> mp[1005];
queue<int> q;
void bfs(int x){
int flag[1005]={0},sum=1,ans=0;
flag[x]=1;
for(int i=1;i<=n;i++){
if(!flag[i]){
ans++;
q.push(i);
while(q.size()){
int f=q.front();
q.pop();
if(!flag[f]){
flag[f]=1;
sum++;
for(int j=0;j<mp[f].size();j++){
if(flag[mp[f][j]]==0) q.push(mp[f][j]);
}
}
}
}
}
cout<<ans-1<<endl;
}
int main(){
cin>>n>>m>>k;
for(int i=0;i<m;i++){
cin>>x1>>x2;
mp[x1].push_back(x2);
mp[x2].push_back(x1);
}
for(int i=0;i<k;i++){
cin>>x1;
bfs(x1);
}
return 0;
}