P1197 JSOI2008 星球大戰 寫題筆記

2021-09-19 17:13:24 字數 994 閱讀 7715

#include#include#include#includeusing namespace std;

// 倒過來求解

// 將全部有通道的點以邊的形式存起來,將所有要攻擊的點存起來

// 先將所有要拆除的點排除在外,把戰爭結束的最終結果的圖構建出來, 把此時的連通塊數存起來

// 從後往前, 把原本順序攻擊的點 反著構建回去, 每構建完乙個點 把此時的連通塊數存起來

// 輸出答案

const int maxn = 400009;//雙向存邊,大小開雙倍

int f[maxn], head[maxn], hink[maxn], ans[maxn], t = 0; //f為並查集,hink記錄要拆掉的點 ,ans存要輸出的結果

bool vis[maxn];//標記hink中的點是否已經復原

struct node

a[maxn];

void add(int u, int v)

int find(int x)

return f[x];

}int main()

for(int i = 0; i < m; i++)

cin >> k;

for(int i = 1; i <= k; i++)

tol = n - k; // 所有點都沒有連通時,連通塊為n, 現在除去 要攻擊的k個點,還剩 tol個點,即tol個連通塊

//用剩下的tol個點,構建出戰爭結束後的圖

for(int i = 0; i < 2 * m; i++)}}

ans[k + 1] = tol; //戰爭結束時連通塊的個數

for(int i = k; i >= 1; i--)//把要攻擊的k個點反著構建回去

} }

ans[i] = tol;

} for(int i = 1; i <= k + 1; i++)

return 0;

}

P1197 JSOI2008 星球大戰

思路和關閉農場差不多,不過加了一些時間上的優化。當我們加入乙個點時,先假設又加入乙個單獨的連通塊,然後再掃一下與它相連的點如果在圖中但是與它不在乙個聯通塊中,那麼就將其合併,連通塊個數減一。注 並查集的題果斷找祖宗。include include include include define n 4...

P1197 JSOI2008 星球大戰

題目 p1197 jsoi2008 星球大戰 分析 看完題目,第一眼就是想到,我們反過來不斷把新的邊加入,然後利用陣列儲存答案,最後逆序輸出。num 陣列用來給破壞的星球編號 從大到小 為什麼要編號呢?因為後面 sort 排序是根據這個編號來的。預處理時,我們以兩個星球中 x,y 最大值作為該邊的編...

P1197 JSOI2008 星球大戰

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