思路
- 直接把被占领的城市标记为已访问,遍历得到连通图的数量,减一即为所求。
注意
代码
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=10001;
int N,M,K;
int G[maxn][maxn]={0};
bool vis[maxn]={false};
void BFS(int u){
queue<int> q;
q.push(u);
vis[u]=true;
while(q.size()){
int temp=q.front();
q.pop();
for(int i=1;i<=N;i++){
if(G[temp][i]&&vis[i]==false){
q.push(i);
vis[i]=true;
}
}
}
}
int BFSTrave(){
int ans=0;
for(int i=1;i<=N;i++){
if(vis[i]==false){
BFS(i);
ans++;
}
}
return ans;
}
void initial(){
for(int i=1;i<=N;i++){
vis[i]=false;
}
}
int main(){
scanf("%d%d%d",&N,&M,&K);
int a,b,c;
for(int i=1;i<=M;i++){
scanf("%d%d",&a,&b);
G[a][b]=G[b][a]=1;
}
for(int i=0;i<K;i++){
initial();
scanf("%d",&c);
vis[c]=true;
int ans=BFSTrave();
printf("%d\n",ans-1);
}
return 0;
}