求助RE
查看原帖
求助RE
539583
_huangweiliang_楼主2022/8/18 20:15
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N = 4e6 + 10;

int n, m, fa[N], head[N], tot, k, brk[N], total, ans[N];

bool flag[N];

struct IOI{
	int next, node, from;
}a[N];

int find(int x){
	if(fa[x] == x)
		return x;
	else
		return fa[x] = find(fa[x]);
}

int kkk(int u, int v){
	if(find(v) != find(u))
		fa[find(v)] = find(u);
}

void init(){
	cin >> n >> m;
	for(int i = 0; i < n; i++){
		fa[i] = i;
		head[i] = -1;
	}
}

void add(){
//	cout << m << '\n';
	for(int i = 1; i <= m; i++){
		int x, y;
		cin >> x >> y;
    	a[++tot].from = x;
   		a[tot].next = head[x];
    	head[x] = tot;
    	a[tot].node = y;
    	
    	a[++tot].from = y;
   		a[tot].next = head[y];
    	head[y] = tot;
    	a[tot].node = x;
	}		
}

void init2(){
	cin >> k;
	for(int i = 1; i <= k; i++){
		cin >> brk[i];
		flag[brk[i]] = 1;
	}
	total = n - k;
}

void jibian(){
	for(int i = 1; i <= 2 * m; i++){
		if(!flag[a[i].from] && !flag[a[i].node] && find(a[i].from) != find(a[i].node)){
			total--;
			kkk(a[i].from, a[i].node);
		}
	}
}

void xiujian(){
	ans[k + 1] = total;
	for(int i = k; i >= 1; i--){
		total++;
		flag[brk[i]] = 0;
		for(int j = head[brk[i]]; j != -1; j = a[j].next){
			if(!flag[a[j].node] && find(brk[i]) != find(a[j].node)){
				 total--;
				 kkk(brk[i], a[j].node);
			}
		}	
		ans[i] = total;
	}

}

void answer(){
	for(int i = 1; i <= k + 1; i++)
		cout << ans[i] << endl;
}
signed main(){
	init();
	add();
	init2();
	jibian();
	xiujian();
	answer();
	return 0;
}//by hwl
2022/8/18 20:15
加载中...