當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
洛谷 P1197 [JSOI2008]星球大战
生活随笔
收集整理的這篇文章主要介紹了
洛谷 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]星球大战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: requests不加代理
- 下一篇: 小程序页面遮罩且不能滚动 + 内容居中显