90分Re求调
查看原帖
90分Re求调
1462623
CXYyyds1楼主2025/6/14 11:13
#include <bits/stdc++.h>
using namespace std;

const int MAX = 2e5 + 5;

vector<int> star[MAX];  // 星际通道邻接表
bool gone[MAX];         // 星球是否被摧毁
int kill_order[MAX];    // 摧毁顺序
int ans[MAX];           // 答案记录
int dad[MAX];           // 并查集父节点
int size[MAX];          // 并查集大小

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

void merge(int x, int y) {
    x = find(x);
    y = find(y);
    if (x != y) {
        if (size[x] > size[y]) swap(x, y);
        dad[x] = y;
        size[y] += size[x];
    }
}

int main() {

    int N, M;
    cin >> N >> M;

    for (int i = 0; i < M; i++) {
        int a, b;
        cin >> a >> b;
        star[a].push_back(b);
        star[b].push_back(a);
    }

    int K;
    cin >> K;
    for (int i = 0; i < K; i++) {
        cin >> kill_order[i];
        gone[kill_order[i]] = true;
    }
    for (int i = 0; i < N; i++) {
        dad[i] = i;
        size[i] = 1;
    }

    int cnt = 0; 

    for (int i = 0; i < N; i++) {
        if (!gone[i]) {
            cnt++;
            for (int neighbor : star[i]) {
                if (!gone[neighbor]) {
                    if (find(i) != find(neighbor)) {
                        merge(i, neighbor);
                        cnt--;
                    }
                }
            }
        }
    }

    ans[K] = cnt; 

    for (int i = K - 1; i >= 0; i--) {
        int x = kill_order[i];
        gone[x] = false;
        cnt++;
        for (int neighbor : star[x]) {
            if (!gone[neighbor]) {
                if (find(x) != find(neighbor)) {
                    merge(x, neighbor);
                    cnt--;
                }
            }
        }
        ans[i] = cnt;
    }

    for (int i = 0; i <= K; i++) {
        cout << ans[i] << '\n';
    }

    return 0;
}
2025/6/14 11:13
加载中...