給出一張圖,每次刪除乙個點(以及連線它的邊),求每次刪除後的連通塊個數。
時間倒流應該是很顯然的吧。
由於並查集的刪除操作並不好搞,所以可以考慮反過來,把「刪除」變成「建造」。
首先用vec
torv
ecto
r記錄每乙個點連線的邊。不需要用領接表,因為每條邊只需訪問1次。用que
uequ
eue會mle。
然後用use
duse
d記錄需要建造的點,把不用建造的點之間的邊連起來。
之後依次列舉建造的點,處理一下與其相連的點,如果不在同一集合就合併,並且連通塊數量減1。
這樣的時間複雜度就是o(m
×α(n
))o(
m×α(
n))
#include
#include
using
namespace std;
const
int n=
400010
;int n,m,x,y,father[n]
,ans[n]
,a[n]
;bool used[n]
;vector<
int> q[n]
;int
find
(int x)
intmain()
scanf
("%d"
,&m)
;for
(int i=
1;i<=n;i++
) father[i]
=i;for
(int i=
1;i<=m;i++
) ans[0]
=n-m;
for(
int i=
1;i<=n;i++)if
(!used[i]
) q[i]
.pop_back()
;}}for
(int i=
1;i<=m;i++
) q[x]
.pop_back()
;}used[x]=0
;}for(
int i=m;i>=
0;i--
)printf
("%d\n"
,ans[i]);
return0;
}
洛谷 P1197星球大戰
很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治著整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反抗軍占領的...
洛谷P1197星球大戰 並查集,逆向思維
題目 思路 逆向思維 並查集刪邊特難,所以採用逆向操作。開始,n個點看作n個孤立點,記ans k n。然後每增加乙個摧毀點,令ans k 重要 逆向增加摧毀點,該點記為now,此時ans i 因為now是新增的孤立點。遍歷now的相鄰點,如果now與它的相鄰點祖先不一樣,則合併,同時ans i 採用...
P1197 星球大戰 並查集 離線處理
題目描述 很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治著整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反...