洛谷P1197 星球大戰 並查集

2022-09-01 10:12:11 字數 1209 閱讀 2588

給出一張圖,每次刪除乙個點(以及連線它的邊),求每次刪除後的連通塊個數。

時間倒流應該是很顯然的吧。

由於並查集的刪除操作並不好搞,所以可以考慮反過來,把「刪除」變成「建造」。

首先用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 星球大戰 並查集 離線處理

題目描述 很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治著整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反...