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

歡迎訪問 生活随笔!

生活随笔

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

javascript

【JSOI2008】星球大战 (并查集)

發布時間:2024/4/17 javascript 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【JSOI2008】星球大战 (并查集) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題面

Description

很久以前,在一個遙遠的星系,一個黑暗的帝國靠著它的超級武器統治者整個星系。某一天,憑著一個偶然的機遇,一支反抗軍摧毀了帝國的超級武器,并攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連接。 但好景不長,很快帝國又重新造出了他的超級武器。憑借這超級武器的力量,帝國開始有計劃地摧毀反抗軍占領的星球。由于星球的不斷被摧毀,兩個星球之間的通訊通道也開始不可靠起來。現在,反抗軍首領交給你一個任務:給出原來兩個星球之間的以太隧道連通情況以及帝國打擊的星球順序,以盡量快的速度求出每一次打擊之后反抗軍占據的星球的連通快的個數。(如果兩個星球可以通過現存的以太通道直接或間接地連通,則這兩個星球在同一個連通塊中)。

Input

第一行包含兩個整數N (2 ≤ N ≤ 2M)和M (1 ≤ M ≤ 200,000),分別表示星球的數目和“以太”隧道的數目。星球用0到N – 1的整數編號。

接下來的M行,每行包含兩個整數X和Y (0 ≤ X ≠ Y < N),表示星球X和星球Y之間有“以太”隧道,可以直接通訊。

接下來的一行包含一個整數K,表示將遭受攻擊的星球的數目。

接下來的K行,每行一個整數,按照順序列出了帝國軍的攻擊目標。這K個數互不相同,且都在0到N – 1的范圍內。

Output

第一行是開始時星球的連通塊個數。接下來的N行,每行一個整數,表示經過該次打擊后現存星球的連通塊個數。

Sample Input

8 13
0 1
1 6
6 5
5 0
0 6
1 2
2 3
3 4
4 5
7 1
7 2
7 6
3 6
5
1
6
3
5
7

Sample Output

1
1
1
2
3
3

題解

考慮正向來做的話,很顯然,無法維護聯通快,只能夠每一次重新來做一遍并查集(因為你要拆邊)
但是,反著來看這道題,每次恢復一個點,這樣就可以并查集來搞了。

#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define MAX 1000000 inline int read() {register int x=0,t=1;register char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-'){t=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*t; } struct Line {int v,next; }e[MAX]; int h[MAX],cnt=1,A[MAX]; int f[MAX],tt[MAX]; bool killed[MAX]; int N,M,KK,Ans; inline void Add(int u,int v) {e[cnt]=(Line){v,h[u]};h[u]=cnt++; } int getf(int x) {return x==f[x]?x:f[x]=getf(f[x]); } int main() {N=read();M=read();for(int i=1;i<=M;++i){int u=read()+1,v=read()+1;Add(u,v);Add(v,u);}KK=read();for(int i=1;i<=KK;++i){tt[i]=read()+1;killed[tt[i]]=true;}for(int i=1;i<=N;++i)f[i]=i;for(int i=1;i<=N;++i){if(!killed[i]){for(int j=h[i];j;j=e[j].next){if(!killed[e[j].v])f[getf(i)]=getf(e[j].v);}}}for(int i=1;i<=N;++i)if(f[i]==i&&!killed[i])++Ans;A[KK+1]=Ans;for(int i=KK;i;--i){killed[tt[i]]=false;Ans++;for(int j=h[tt[i]];j;j=e[j].next){if(killed[e[j].v])continue;int x=getf(e[j].v),y=getf(tt[i]);if(x==y)continue;else{f[x]=y;--Ans;}}A[i]=Ans;}for(int i=1;i<=KK+1;++i)printf("%d\n",A[i]);return 0; }

轉載于:https://www.cnblogs.com/cjyyb/p/7410928.html

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的【JSOI2008】星球大战 (并查集)的全部內容,希望文章能夠幫你解決所遇到的問題。

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