【并查集】黑魔法师之门(codevs 1995/joyoi-codevs 1995)
黑魔法師之門
codevs 1995
joyoi-codevs 1995
題目大意:
有一堆點,每一次操作添加一條邊,并要輸出每個點的度數都大于1并為偶數的子圖的個數
原題:
題目描述
經過了16個工作日的緊張忙碌,未來的人類終于收集到了足夠的能源。然而在與Violet星球的戰爭中,由于Z副官的愚蠢,地球的領袖applepi被邪惡的黑魔法師Vani囚禁在了Violet星球。為了重啟Nescafe這一宏偉的科技工程,人類派出了一支由XLk、Poet_shy和lydrainbowcat三人組成的精英隊伍,穿越時空隧道,去往Violet星球拯救領袖applepi。
applepi被囚禁的地點只有一扇門,當地人稱它為“黑魔法師之門”。這扇門上畫著一張無向無權圖,而打開這扇門的密碼就是圖中每個點的度數大于零且都是偶數的子圖的個數對1000000009取模的值。此處子圖 (V,E) 定義為:點集V和邊集E都是原圖的任意子集,其中E中的邊的端點都在V中。
但是Vani認為這樣的密碼過于簡單,因此門上的圖是動態的。起初圖中只有N個頂點而沒有邊。Vani建造的門控系統共操作M次,每次往圖中添加一條邊。你必須在每次操作后都填寫正確的密碼,才能夠打開黑魔法師的牢獄,去拯救偉大的領袖applepi。
輸入描述
第一行包含兩個整數N和M。
接下來M行,每行兩個整數A和B,代表門控系統添加了一條無向邊 (A,B)。
輸出描述
輸出一共M行,表示每次操作后的密碼。
樣例輸入
4 8 3 1 3 2 2 1 2 1 1 3 1 4 2 4 2 3樣例輸出
0 0 1 3 7 7 15 31數據范圍及提示
第三次添加之后,存在一個滿足條件的子圖 {1,2,3}(其中1,2,3是數據中邊的標號)。
第四次添加之后,存在三個子圖 {1,2,3},{1,2,4},{3,4}。
……
對于30% 的數據,N,M≤10。
對于100% 的數據,N≤200000,M≤300000。
解題思路:
我們可以發現符合的一定是一個環或多個環,所以有x個環時,用一個01串來表示每一個換選不選,然而全排列結果有2x2^x2x種,因為不能全部不選,所以還要減1
所以每次操作如果沒建立一個環,那就直接連接,如果建立了,就ans=ans*2+1(乘2是之前的都可以和當前環0或1相交一次,所以要乘2,加一是只有當前環)
代碼:
#include<cstdio> #define max(a,b) (a)>(b)?(a):(b) #define min(a,b) (a)<(b)?(a):(b) using namespace std; int n,m,x,y,xx,yy,ans,dad[200005]; int find(int dep){return dad[dep]==dep?dep:dad[dep]=find(dad[dep]);}//并查集 int main() {scanf("%d %d",&n,&m);for (int i=1;i<=n;++i)dad[i]=i;for (int i=1;i<=m;++i){scanf("%d %d",&x,&y);if (find(x)!=find(y))//沒建立一個環{xx=find(x);yy=find(y);dad[min(xx,yy)]=max(xx,yy);//連接}else ans=(ans*2+1)%1000000009;//建立了一個環printf("%d\n",ans);} }總結
以上是生活随笔為你收集整理的【并查集】黑魔法师之门(codevs 1995/joyoi-codevs 1995)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 路由器密码怎么更改怎样更改路由器密码
- 下一篇: 【并查集】Supermarket(poj