1013. Battle Over Cities (25)
对于集合操作,用并查集代码简单,复杂度低。
由于粗心出现了个段错误,就是数组越界了,城市有N个,路可能有N*N条。
#include<cstdio>
const int N=1002;
int father[N],x[N*N],y[N*N],n,m;
int find(int v){
if(father[v]!=v)
father[v]=find(father[v]);
return father[v];
}
void init(){
for(int i=0;i<N;i++)
father[i]=i;
}
void Query(int q){
int u,v,rst=1;
for(int i=0;i<m;i++){
if(x[i]==q||y[i]==q) continue;
u=find(x[i]),v=find(y[i]);
if(u!=v)
father[u]=v,rst++;
}
int ans=n-1-rst;
printf("%d\n",ans);
}
int main(){
int k,q;
scanf("%d %d %d",&n,&m,&k);
for(int i=0;i<m;i++)
scanf("%d %d",&x[i],&y[i]);
while(k--){
init();
scanf("%d",&q);
Query(q);
}
return 0;
}