順序做一定會超時
考慮逆序做
先把該刪除的點全部刪除
然後逆序加入圖中,在加入的過程判斷聯通不聯通;
不聯通的話就讓連通塊的個數-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 採用...