題目描述
很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級**統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級**,並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。
但好景不長,很快帝國又重新造出了他的超級**。憑藉這超級**的力量,帝國開始有計畫地摧毀反抗軍占領的星球。由於星球的不斷被摧毀,兩個星球之間的通訊通道也開始不可靠起來。現在,反抗軍首領交給你乙個任務:給出原來兩個星球之間的以太隧道連通情況以及帝國打擊的星球順序,以盡量快的速度求出每一次打擊之後反抗軍佔據的星球的連通快的個數。(如果兩個星球可以通過現存的以太通道直接或間接地連通,則這兩個星球在同乙個連通塊中)。
輸入輸出格式
輸入格式:
輸入檔案第一行包含兩個整數,n (1 <= n <= 2m) 和m (1 <= m <= 200,000),分別表示星球的數目和以太隧道的數目。星球用0~n-1的整數編號。
接下來的m行,每行包括兩個整數x, y,其中(0<=x<>y < n),表示星球x和星球y之間有以太隧道。注意所有的以太隧道都是雙向的。
接下來一行是乙個整數k,表示帝國計畫打擊的星球個數。
接下來的k行每行乙個整數x,滿足0<=x < n,表示帝國計畫打擊的星球編號。帝國總是按輸入的順序依次摧毀星球的。
輸出格式:
輸出檔案的第一行是開始時星球的連通塊個數。
接下來的k行,每行乙個整數,表示經過該次打擊後現存星球的連通塊個數。
輸入輸出樣例
輸入樣例#1:
8 13
0 1
1 6
6 5
5 0
0 6
1 2
2 3
3 4
4 5
7 1
7 2
7 6
3 6
5 1
6 3
5 7
輸出樣例#1:
1 1
1 2
3 3
說明 [jsoi2008]
這題需要倒序求解(也就是答案倒著得到),先將所有無關的邊加上,此時的聯通塊個數即為最後乙個答案,之後倒序加點,依次算出各情況下的聯通塊數,最後將答案輸出即可
code:(中間加注釋的是我第一次做的**留作紀念qaq)
#include
int n,m,t,sum,cnt,tot;
int st[400010],fa[400010],head[400010],lian[400010],ans[400010];
bool flag[400010];
struct edgedge[400010];
void add(int x,int y)
int find(int x)
//int creat(int x)
// }
// for(register int i=0;i// return sum;
//}//
//void act1()
int main()
scanf("%d",&t);
for(register
int i=1;i<=t;i++)
for(register
int i=0;i// act1();
int tot=n-t;
for(int i=1;i<=cnt;i++)
ans[t+1]=tot;
for(int i=t;i;i--)
ans[i]=tot;
}for(int i=1;i<=t+1;i++) printf("%d\n",ans[i]);
return
0;}
洛谷 P1197 JSOI2008 星球大戰
題目描述 很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反...
洛谷P1197 JSOI2008 星球大戰
思路 首先動態求割點會tle,考慮倒序離線操作。當所有打擊完成後,tarjin統計同一連通分量上的點,並查集維護連通性 實際上來說只要兩點之間有邊則將之合併即可tarjin處理麻煩反而會mle?不清楚為什麼 再依次將被毀滅的星球復原,則對答案的影響只與當前星球連線的星球數量 及連通關係 有關,每次統...
洛谷P1197 JSOI2008 星球大戰
很久以前,在乙個遙遠的星系,乙個黑暗的帝國靠著它的超級 統治者整個星系。某一天,憑著乙個偶然的機遇,一支反抗軍摧毀了帝國的超級 並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。但好景不長,很快帝國又重新造出了他的超級 憑藉這超級 的力量,帝國開始有計畫地摧毀反抗軍占領的...