40pts求调
查看原帖
40pts求调
1034647
Zyh_AKer楼主2024/11/5 11:51
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 5e5 + 10;
int n, m, k;
vector <int> edge[N];
int a[N];
bool is[N];
int fa[N];
int sz[N];
int ans[N];
int rt;
void init()
{
	for (int i = 0; i < n; i++)
	{
		fa[i] = i;
		sz[i] = 1;
	}
}
int fa_find(int x)
{
	if (x == fa[x])return x;
	else return fa[x] = fa_find(fa[x]);
}
void fa_union(int x, int y)
{
	x = fa_find(x);
	y = fa_find(y);
	if (x == y)return;
	if (sz[x] > 1)rt--;
	//rt = max(rt, 1);
	if (sz[x] > sz[y])swap(x, y);
	fa[x] = y;
	sz[y] += sz[x];
}
int main()
{
	cin >> n >> m;
	init();
	for (int i = 1; i <= m; i++)
	{
		int x, y;
		cin >> x >> y;
		edge[x].push_back(y);
		edge[y].push_back(x);
	}
	cin >> k;
	for (int i = 1; i <= k; i++)
	{
		cin >> a[i];
		is[a[i]] = true;
	}
	for (int i = 0; i < n; i++)
	{
		if (is[i])continue;
		for (int j : edge[i])
		{
			if (is[j])continue;
			fa_union(i, j);
		}
	}
	for (int x = 0; x < n; x++)
	{
		if (fa[x] == x && !is[x])
		{
			rt++;
		}
	}
	for (int i = k; i >= 0; i--)
	{
		ans[i] = rt;
		if (!i)break;
		is[a[i]] = false;
		bool flag = false;
		for (int j : edge[a[i]])
		{
			if (!is[j])
			{
				fa_union(a[i], j);
				flag = true;
			}
		}
		if (!flag)rt++;
	}
	for (int i = 0; i <= k; i++)
	{
		cout << ans[i] << endl;
	}
	return 0;
}
2024/11/5 11:51
加载中...