样例过不了
查看原帖
样例过不了
1018489
mihoyo_GenShin楼主2023/12/2 22:01

这个题样例过不了,思路是利用倒推来模拟打击前的连通块个数,代码如下:```cpp #include<bits/stdc++.h> using namespace std; const int N = 2e6 + 10; vector G[N]; int fa[N],block; int bad[N]; int del[N]; int res[N]; int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); } void add_edge(int x,int y) { int fx = find(x); int fy = find(y); if (fx == fy) { return; } block--; fa[fx] = fy; } int main() { // n个元素 block个连通块 int n,m; cin >> n >> m; block = n; for (int i = 1;i <= n;i++) { fa[i] = i; } for (int i = 1;i <= m;i++) { int x,y; cin >> x >> y; add_edge(x,y); } int k; cin >> k; for (int i = 1;i <= k;i++) { cin >> bad[i]; del[bad[i]] = 1; } for (int i = 1;i <= k;i++) { for (int j = 0;j < G[i].size();j++) { int v = G[i][j]; if (del[v] == 0) { add_edge(i,v); } } } for (int i = k;i >= 1;i--) { int u = bad[i]; res[i] = block; for (int j = 0;j < G[u].size();j++) { int v = G[u][j]; if (del[v] == 0) { add_edge(u,v); } } } cout << block << endl; for (int i = 1;i <= k;i++) { cout << res[i] << endl; } }

2023/12/2 22:01
加载中...