PAT 甲级 1013 Battle Over Cities
每次查询统计删除被占领节点之后剩下的图的连通分支数,再减一即可。这道题 K 不是特别大,不用特殊处理。
特殊处理的话应该是求出DFS树和割点,然后在原图联通分支的数目上加减即可,每次查询是 O(1) 的,具体可以参考这篇文章。
#include <bits/stdc++.h>
using namespace std;
int n,m,k,ocuppied;
vector<int> graph[1010];
bool in_q[1010];
void BFS(int root){
queue<int> q;
q.push(root);in_q[root]=true;
while(!q.empty()){
int now=q.front();q.pop();
for(auto i:graph[now]){
if(i!=ocuppied&&!in_q[i]){
q.push(i);
in_q[i]=true;
}
}
}
}
int main() {
cin.tie(0);std::ios::sync_with_stdio(false);
cin>>n>>m>>k;
int city1,city2;
for(int i=0;i<m;++i){
cin>>city1>>city2;
graph[city1].push_back(city2);
graph[city2].push_back(city1);
}
while(k--){
memset(in_q,0,sizeof(in_q));
cin>>ocuppied;int block_num=0;
for(int i=1;i<=n;++i){
if(!in_q[i]&&i!=ocuppied){
BFS(i);
block_num++;
}
}
cout<<block_num-1<<endl;
}
}