題目描述:
很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級**統治著整個星系。
某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級**,並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。
但好景不長,很快帝國又重新造出了他的超級**。憑藉這超級**的力量,帝國開始有計畫地摧毀反抗軍占領的星球。由於星球的不斷被摧毀,兩個星球之間的通訊通道也開始不可靠起來。
現在,反抗軍首領交給你乙個任務:給出原來兩個星球之間的以太隧道連通情況以及帝國打擊的星球順序,以盡量快的速度求出每一次打擊之後反抗軍佔據的星球的連通塊的個數。(如果兩個星球可以通過現存的以太通道直接或間接地連通,則這兩個星球在同乙個連通塊中)。
#include
using
namespace std;
#define inf 0x3f3f3f3f
int n,m,k;
const
int maxn =
2e6+10;
vector<
int> g[maxn]
;int res[maxn]
,ans[maxn]
;int p[maxn]
,vis[maxn]
;int
find
(int x)
intmain()
scanf
("%d"
,&k)
;for
(int i =
1; i <= k; i++
)for
(int i =
0; i < n; i++)}
int cnt =0;
for(
int i =
0; i < n; i++
) ans[k]
=cnt;
for(
int i = k; i>=
1; i--)}
vis[v]=0
;if(!c1) cnt++
; ans[i-1]
= cnt;
}for
(int i =
0; i <= k; i++
)printf
("%d\n"
,ans[i]);
}
洛谷P1197 星球大戰 並查集
給出一張圖,每次刪除乙個點 以及連線它的邊 求每次刪除後的連通塊個數。時間倒流應該是很顯然的吧。由於並查集的刪除操作並不好搞,所以可以考慮反過來,把 刪除 變成 建造 首先用vec torv ecto r記錄每乙個點連線的邊。不需要用領接表,因為每條邊只需訪問1次。用que uequ eue會mle...
P1197 星球大戰
很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反抗軍占領的...
洛谷P1197星球大戰 並查集,逆向思維
題目 思路 逆向思維 並查集刪邊特難,所以採用逆向操作。開始,n個點看作n個孤立點,記ans k n。然後每增加乙個摧毀點,令ans k 重要 逆向增加摧毀點,該點記為now,此時ans i 因為now是新增的孤立點。遍歷now的相鄰點,如果now與它的相鄰點祖先不一樣,則合併,同時ans i 採用...