日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

洛谷 P1197 [JSOI2008]星球大战

發布時間:2025/4/16 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 P1197 [JSOI2008]星球大战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意簡述

有n個點和m條通道,
現在按順序破壞k個點
求每一次破壞后聯通塊的個數

題解思路

并查集,逆序做,
先假設給的k個星球全都被炸,求出此時的聯通塊個數,就是經過k次打擊的聯通塊個數。
然后每次加上一個被炸的星球,就求出了經過每次次打擊后的聯通塊個數

代碼

#include <cstdio> using namespace std; int n, m, k, u, v, cnt, sum, x, y; int d[401000], fa[401000], ans[401000]; int f[401000], to[801000], nxt[801000]; bool bd[401000]; void add_edge(int u, int v) {to[++cnt] = v;nxt[cnt] = f[u];f[u] = cnt; } int gf(int x) {return x == fa[x] ? x : fa[x] = gf(fa[x]); } int main() {scanf("%d%d", &n, &m);for (register int i = 1; i <= m; ++i){scanf("%d%d", &u, &v);add_edge(u, v);add_edge(v, u);}for (register int i = 0; i < n; ++i) fa[i] = i;scanf("%d", &k);for (register int i = 1; i <= k; ++i){scanf("%d", &d[i]);bd[d[i]] = 1;}sum = n - k;for (register int i = 0; i < n; ++i)if (!bd[i])for (register int j = f[i]; j; j = nxt[j])if (!bd[to[j]]){x = gf(i);y = gf(to[j]);if (x != y){fa[y] = x;--sum;}}ans[k + 1] = sum;for (register int i = k; i; --i){++sum;bd[d[i]] = 0;x = gf(d[i]);for (register int j = f[d[i]]; j; j = nxt[j])if (!bd[to[j]]){y = gf(to[j]);if (x != y){fa[y] = x;--sum;}}ans[i] = sum;}for (register int i = 1; i <= k + 1; ++i) printf("%d\n", ans[i]); }

轉載于:https://www.cnblogs.com/xuyixuan/p/9594419.html

總結

以上是生活随笔為你收集整理的洛谷 P1197 [JSOI2008]星球大战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。