P1197 JSOI2008 星球大戰

2022-09-03 08:45:11 字數 903 閱讀 9919

並查集+逆序

做這道題前呢,我們先出門左轉關閉農場,一道類似的更簡單一丟丟的題

然後,我們考慮一下這題,因為並沒有過多的操作,只是要我們求一下連通塊的個數而已(也就是連通性,具有傳遞性的連通),而這恰好是並查集所擅長的。

然而,我們正向看題目時就會發現不支援刪除操作的並查集似乎辦不到。但,如果我們把刪除操作換成加入操作,就可以辦到了。這也就是逆向思維。題目支援離線,所以我們可以逆向處理出所有答案以後再全部輸出就好了。

考慮最後的連通狀態:標記摧毀的點,把不摧毀的點之間能連的邊連起來,同時統計連通塊的數量即為所求

中間的連通狀態:於最後的連通狀態處理方法類似,從後往前依次加入被刪除的點,列舉出邊,連通。統計連通塊的數量即為所求

倒序存,正序輸shu 

#includeusing namespace std;

int now[400010],tot;

int team[400010];

bool flag[400010];//是否存在

int father[400010];

int n,m,k;

int ans[400010];

int sum;

struct node

a[400010];//鄰接表存圖

void put(int x,int y)

int find(int x)

//並查集基本操作

void unionn(int x,int y)

//同上

int main()

}ans[i]=sum;

}//倒著做

// printf("k:%d\n",k);

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

printf("%d\n",ans[i]);

}

P1197 JSOI2008 星球大戰

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

P1197 JSOI2008 星球大戰

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

P1197 JSOI2008 星球大戰

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