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