E - Reachable Set
题目链接:https://atcoder.jp/contests/abc401/tasks/abc401_e
题意:
给定一个无向图,1为根节点。要求求出当k分别=1,2,3....n时
需要消除点使得1,2,3,..k的节点连通并且使消除的点最少
思路:
并查集+set
对于每一个k节点,与比k小的点进行merge,将比k大的点塞进集合中
如果k节点和1节点在同一个集合内,并且集合大小刚好等于k,那么说明这是一定是一个由1,2,3...k组成的连通块
同时只需要删除每一个节点相连的较大的点,使得删除的点数最小
当遍历到k时,需要将k从需要删除的集合中erase出来
vector<int>e[maxn];
int f[maxn];
int find(int x){
if(f[x]!=x)f[x]=find(f[x]);return f[x];
}
int w[maxn];
void merge(int x,int y){
if(find(x)!=find(y)){
w[find(y)]+=w[find(x)];
f[find(x)]=find(y);
}
}
void solve(){
int n,m;cin>>n>>m;
rep(i,1,n)f[i]=i;
rep(i,1,n)w[i]=1;
rep(i,1,m){
int u,v;cin>>u>>v;
e[u].pb(v);e[v].pb(u);
}
set<int>st;
rep(i,1,n){
int k=i;
st.erase(k);
for(int v:e[k]){
if(v>k)st.insert(v);else merge(k,v);
}
if(find(1)==find(k)&&w[find(1)]==k){
cout<<st.size()<<endl;
}else cout<<-1<<endl;
}
}

浙公网安备 33010602011771号