很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級**統治著整個星系。
某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級**,並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。
但好景不長,很快帝國又重新造出了他的超級**。憑藉這超級**的力量,帝國開始有計畫地摧毀反抗軍占領的星球。由於星球的不斷被摧毀,兩個星球之間的通訊通道也開始不可靠起來。
現在,反抗軍首領交給你乙個任務:給出原來兩個星球之間的以太隧道連通情況以及帝國打擊的星球順序,以盡量快的速度求出每一次打擊之後反抗軍佔據的星球的連通塊的個數。(如果兩個星球可以通過現存的以太通道直接或間接地連通,則這兩個星球在同乙個連通塊中)。
輸入檔案第一行包含兩個整數n,m,分別表示星球的數目和以太隧道的數目。星球用 0∼n
−1
0 \sim n-1
0∼n−
1的整數編號。
接下來的 m 行,每行包括兩個整數x,y,表示星球 x 和星球 y 之間有 「以太」 隧道,可以直接通訊。
接下來的一行為乙個整數 k ,表示將遭受攻擊的星球的數目。
接下來的 k 行,每行有乙個整數,按照順序列出了帝**的攻擊目標。這 k 個數互不相同,且都在 0到 n−1 的範圍內。
第一行是開始時星球的連通塊個數。接下來的 k 行,每行乙個整數,表示經過該次打擊後現存星球的連通塊個數。
輸入
8130
1166
5500
6122
3344
5717
2763
6516
357
輸出111
233
【資料範圍】
對於100% 的資料,1≤m
≤2×1
05,1
≤n≤2
m,x≠
y。
1\le m \le 2\times 10^5 ,1\le n \le 2m,x \neq y。
1≤m≤2×
105,
1≤n≤
2m,x
=y
。 從後往前復活點,做並查集,用鄰接表 。
#include
#include
#include
#include
using
namespace std;
int n,m,f[
400010
],ans[
400010
],c[
400010
],h[
400010];
bool d[
400010];
struct jgt
p[400010];
intfind
(int x)
//找代表值
intmain()
scanf
("%d"
,&k)
;for
(i=1
;i<=k;d[c[i]]=
1,i++
)scanf
("%d"
,&c[i]);
for(ans[k+1]
=n-k,i=
1;i<=tot;i++
)for
(i=k;i>
0;i--
)for
(ans[i]
=ans[i+1]
+1,d[c[i]]=
0,j=h[c[i]
];j;j=p[j]
.nxt)
//用鄰接表
for(i=
1;i<=k+
1;i++
)printf
("%d\n"
,ans[i]);
return0;
}
P1197 星球大戰
很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反抗軍占領的...
洛谷P1197 星球大戰 並查集
給出一張圖,每次刪除乙個點 以及連線它的邊 求每次刪除後的連通塊個數。時間倒流應該是很顯然的吧。由於並查集的刪除操作並不好搞,所以可以考慮反過來,把 刪除 變成 建造 首先用vec torv ecto r記錄每乙個點連線的邊。不需要用領接表,因為每條邊只需訪問1次。用que uequ eue會mle...
洛谷P1197星球大戰 並查集,逆向思維
題目 思路 逆向思維 並查集刪邊特難,所以採用逆向操作。開始,n個點看作n個孤立點,記ans k n。然後每增加乙個摧毀點,令ans k 重要 逆向增加摧毀點,該點記為now,此時ans i 因為now是新增的孤立點。遍歷now的相鄰點,如果now與它的相鄰點祖先不一樣,則合併,同時ans i 採用...