並查集逆序 洛谷P1197

2021-10-03 08:59:05 字數 1053 閱讀 8871

順序做一定會超時

考慮逆序做

先把該刪除的點全部刪除

然後逆序加入圖中,在加入的過程判斷聯通不聯通;

不聯通的話就讓連通塊的個數-1;然後把2個連通塊連起來

還是比較難的

#include

using

namespace std;

const

int n=

4e5+5;

struct nodeedge[n]

;int head[n]

;int broken[n]

;int tot=0;

int bb[n]

;int root[n]

;stack<

int> res;

void

add(

int f,

int t)

intfd

(int a)

return root[a]=fd

(root[a]);

}void

unit

(int a,

int b)

}int

main()

int a,b;

for(

int i=

1;i<=m;i++

)int k;

cin>>k;

for(

int i=

1;i<=k;i++

)int total=n-k;

for(

int i=

1;i<=tot;i++)}

} res.

push

(total)

;for

(int i=k;i>=

1;i--)}

//cout<<"**********= "<}

res.

push

(total)

;//cout<}

while

(res.

size()

)return0;

}

洛谷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 採用...