题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805500414115840
题目大意:有n个城市,m条道路,k个待检测的城市。如果城市a被敌人占领,则所有与a相连的道路将被封锁。问你如果要使剩下的城市两两相通,最少需要修几条路。
思路:简单并查集。判断有几个连通图即可。用二维矩阵存图会超时。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1000+10;
int n,m,k,a,b,p,pre[maxn],ans;
vector<int> g[maxn];
int find(int x){
return x==pre[x]?x:pre[x]=find(pre[x]);
}
void join(int x,int y){
int fx=find(x);
int fy=find(y);
if(fx==fy) return ;
else {
pre[fx]=fy;
}
}
int fun(){
ans=0;
for(int i=1;i<=n;i++)
pre[i]=i;
for(int i=1;i<=n;i++){
if(i!=p){
for(int j=0;j<g[i].size();j++){
if(g[i][j]!=p)
join(i,g[i][j]);
}
}
}
for(int i=1;i<=n;i++){
if(pre[i]==i&&i!=p) ans++;
}
ans=ans-1;
}
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
scanf("%d%d",&a,&b);
g[a].push_back(b);
g[b].push_back(a);
}
for(int i=1;i<=k;i++){
scanf("%d",&p);
fun();
printf("%d\n",ans);
}
}