黑魔法師之門 magician 並查集

2022-05-21 11:42:11 字數 2133 閱讀 8561

題目

輸入輸出

第一行包含兩個整數 n 和 m。 接下來 m 行,每行兩個整數 a和 b,代表門控系統新增了一條無向邊 (a, b)。

輸出一共 m 行,表示每次操作後的密碼。

輸入樣例       

4 8       

3 13 2

2 12 1

1 31 4

2 42 3

輸出樣例 

0 01 

37715

31

題意簡述:每次加邊之後輸出當前圖滿足條件的子圖總個數。

解題思路:這道題,比較迷。首先我是沒有想到怎麼做的。但是,我發現輸出有點東西。簡化一下樣例輸出就是:0,1,3,7,15,31.大聲的告訴我,你們找到規律了嗎!沒找到。如此明顯,規律當然是依次*2+1了。可是我也發現答案也並不是這麼簡單,畢竟還是有加了邊卻沒發現子圖的。那麼什麼時候才能改變答案呢?我們不難發現,滿足題意的乙個顯而易見子圖為乙個三角形。三個點,三條邊。也就是說,加了邊之後能構成乙個三角形,就能*2+1.

那麼如何判斷是否為三角形?很簡單,判斷這條新邊的端點在沒加入之前是否有乙個共同的連線點。於是,就有了如下的**。

#include#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

intread()

while(ch>='

0'&&ch<='9'

)

return res*f;

}const

int maxn=200005

;const ll mod=1000000009

;int

n,m;

setu[maxn];

ll ans;

intmain()

}u[b].insert(c);u[c].insert(b);

if(fl)ans=ans*2+1

; printf(

"%lld\n

",ans);

}fclose(stdin);

fclose(stdout);

return0;

}

view code

不過這段**的速度與正確性都難以保證,畢竟乙個環也是滿足提議的,也就是說還要將能找到的更新一遍。絕對超時。

於是,就有了我們的並查集。(並查集是什麼我就不寫了)

運用並查集,若兩端在同一集合中,就*2+1,若不在,就加入到同一集合,不改變答案。

accode:

#include#include

#include

#include

#include

#include

#define ll long long

using

namespace

std;

intread()

while(ch>='

0'&&ch<='9'

)

return res*f;

}const

int maxn=200005

;const ll mod=1000000009

;int

n,m;

intf[maxn];

ll ans;

int find_f(int

x)int

main()

else ans=(ans*2+1)%mod;

printf(

"%lld\n

",ans);

}fclose(stdin);

fclose(stdout);

return0;

}

view code

不過,筆者我到現在也不太能夠證明這個方法的正確性。我唯一能想到的解釋就是,若在同一集合,則必然找的到一條路徑使得兩端點聯通,此時這條路徑與新加入的邊是等價的。那麼此時新加入的邊與路徑構成乙個只有兩個點的圓,是乙個全新的子圖,這是+1.而新加入的邊同時也可以代替那一條路徑,使得原來的方案雙倍。這是*2.

黑魔法師之門

給出乙個大小為 n 的無向圖,求圖中每個點的度數大於零且都是偶數的子圖的個數。子圖不一定是聯通的!則設圖中最小環 不由其它環組成的環 的個數為 x 如果同一聯通塊中的點再次聯通,就構成了乙個新的最小環。因為這些環選與不選都可構成新子圖,於是 ans 2 x 1 去掉乙個環都不選的情況 include...

Poetize I 黑魔法師之門

描述 description 題解 題意很清楚,但是感覺很神。剛開始一直在想如何構造,發現太複雜 然後查題解發現只有要當前兩點在同一連通塊裡,ans 2,最後輸出ans 1 表示不理解,就沒寫。昨天翻到了lyd的題解 他引入了乙個叫 元環 的東西,然後證明答案就是 2 元環的個數 我表示對元環的概念...

並查集 黑魔法師之門

黑魔法師之門 magician.pas c cpp 題目描述 的個數對1000000009取模的值。此處子圖 v,e 定義為 點集v和邊集e都是原圖的任意子集,其中e中的邊的端點都在v中。輸入格式 第一行包含兩個整數n和m。接下來m行,每行兩個整數a和b,代表門控系統新增了一條無向邊 a,b 輸出格...