PAT1013. Battle Over Cities

考察并查集

#include<list>
#include<utility>
#include<algorithm>
#include<iostream>
using namespace std;
const int N=1002;
int root[N],level[N];
int n,m,k;
list<pair<int,int>>road;
void makeset(){
  for(int i=0;i<N;++i) root[i]=i,level[i]=0;
}

int findset(int x){
  if(root[x]!=x)root[x]=findset(root[x]);
  return root[x];
}
void link(int a,int b){
  int x=findset(a),y=findset(b);
  if(level[x]<level[y])
    root[x]=y;
  else{
    root[y]=x;
    if(level[x]==level[y])
      ++level[x];
  }
}
void repair(int del){
  makeset();
  for(auto &x:road){
    int a=x.first,b=x.second;
    if(a!=del && b!=del &&findset(a)!=findset(b))
      link(a,b);
  }
  int cnt(0);
  for(int i=1;i<n;++i)
    for(int j=i+1;j<=n;++j)
    if(i!=del && j!=del && findset(i)!=findset(j))
      {++cnt;link(i,j);}
  cout<<cnt<<endl;
}
int main(){
  cin>>n>>m>>k;
  while(m--){
    int a,b;cin>>a>>b;
    road.push_back({a,b});
  }
  while(k--){
        int del;cin>>del;
    repair(del);
  }
}


你可能感兴趣的:(PAT1013. Battle Over Cities)