求助
查看原帖
求助
400333
qzilr楼主2021/10/17 21:06
#include <bits/stdc++.h>

using namespace std;
const int maxn = 5e5;

struct T {
	int fa[maxn];
	T(){
		for (int i = 0; i <= maxn; ++i)
			fa[i] = i;
	}
	inline int find(int o) {
		if (fa[o] == o)	return o;
		return fa[o] = find(fa[o]);
	}
	inline void uion(int x, int y) {
		if (find(x) != find(y))
			fa[find(x)] = find(y);
	}
}t;
struct edge {
	int v, next;
}e[maxn];
int head[maxn], tot = 0, sum = 0, broke[maxn], order[maxn], ans[maxn], vis[maxn];

inline void add(int u, int v) {
	e[++tot] = (edge) {v, head[u]};
	head[u] = tot;
}

int main() {
	ios::sync_with_stdio(false);
	int n, m, k;
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int u, v;
		cin >> u >> v;
		add(u, v), add(v, u);
	}
	cin >> k;
	for (int i = 1; i <= k; ++i) {
		int o;
		cin >> o;
		broke[o] = 1, order[i] = o;
	}
	sum = n - k;
	queue<int> q;
	q.push(0);
	vis[0] = 1;
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		if (vis[u])	continue;
		for (int i = head[u]; i; i = e[i].next ) {
			int v = e[i].v ;
			q.push(v);
			vis[v] = 1;
			if (!broke[v] && !broke[u] && t.find(v) != t.find(u) )
				t.uion(v, u), sum--;
		}
	}
	ans[k + 1] = sum;
	for (int i = k; i > 1; --i) {
		int o = order[i];
		sum++;
		for (int l = head[o]; l; l = e[l].next ) {
			int v = e[l].v ;
			if (t.find(v) != t.find(o) )
				t.uion(v, o), sum--; 
		}
		ans[i] = sum;
	}
	for (int i = 2; i <= k + 1; ++i)
		printf("%d\n", ans[i]);
	return 0;
}
2021/10/17 21:06
加载中...