求调
查看原帖
求调
902158
aaalys楼主2024/10/13 22:36
#include <bits/stdc++.h>
using namespace std;

const int N = 2e5 + 10;
int tot;
int fa[N] , q[N] , ans[N];
bool is[N];
vector<int>e[N];
int find(int u){
	if (fa[u] == u)return u;
	return fa[u] = u;
}
void merge(int u , int v){
	int ufa = find(u) , vfa = find(v);
	if (ufa != vfa){
		tot--;
		fa[ufa] = vfa;
	}
}
int main(){
	int n , m;
	cin >>n >> m;
	for (int i = 0; i <= n; i++)fa[i] = i;
	for (int i = 1; i <= m; i++){
		int u , v;
		cin >> u >> v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	int k;
	cin >> k;
	for (int i = 1; i <= k; i++){
		cin >> q[i];
		is[q[i]] = 1;
	}
	for (int i = 0; i < n; i++)
		for (int j:e[i])
			if (!is[i] && !is[j])
				merge(i , j);
	tot = 0;
	for (int i = 0; i < n; i++)
		if (!is[i] && fa[i] == i)
			tot++;
	for (int i = k; i >= 0; i--){
		ans[i] = tot;
		//if (tot < 1)ans[i] = 1;
		tot++;
		is[q[i]] = 0;
		for (int x:e[q[i]])
			if (!is[x])
				merge(x , q[i]);
	}
	//ans[0] = tot;
	for (int i = 0; i <= k; i++)cout << ans[i] << endl;
	return 0;
}
2024/10/13 22:36
加载中...