【PAT甲级】1013 Battle Over Cities (25 分)(并查集,简单联通图)

题意:

输入三个整数N,M,K(N<=1000,第四个数据1e5<=M<=1e6)。有1~N个城市,M条高速公路,K次询问,每次询问输入一个被敌军占领的城市,所有和该城市相连的高速公路全部不能使用,求增加多少条高速公路可以使剩下N-1个城市联通。(原本城市之间可能不联通,假设原本联通只能通过第0,4个数据)。

trick:

同一份代码交很多次,有几次会第4个点超时。(存疑)

代码:

#include<bits/stdc++.h>
using namespace std;
int a[1000007],b[1000007];
int fa[1007];
int find_(int x){
if(fa[x]==x)
return x;
else
return fa[x]=find_(fa[x]);
}
int main(){
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=m;++i)
cin>>a[i]>>b[i];
for(int i=1;i<=k;++i){
int x;
cin>>x;
for(int j=1;j<=n;++j)
fa[j]=j;
for(int j=1;j<=m;++j){
if(a[j]==x||b[j]==x)
continue;
int t=find_(a[j]);
int tt=find_(b[j]);
if(t!=tt)
fa[t]=tt;
}
int cnt=-1;//联通块的数量-1
for(int j=1;j<=n;++j){
if(j==x)
continue;
if(fa[j]==j)
cnt++;
}
cout<<cnt<<"\n";//联通块的数量-1
}
return 0;
}

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/11243535.html