藍橋杯 七段碼 並查集

2021-10-22 23:19:30 字數 1374 閱讀 2622

今天學到了乙個新的演算法:並查集

不得不說:太好用惹!!!嗷!!

所以先來復盤一下並查集的思路

我在網上找了乙個很生動的解釋,講的非常好,又能聽懂知識點,又能記得牢,附上原博連線:這是個鏈結

他是以武林為例講的並查集,並查集的作用呢,就是看乙個圖里的連通分支有幾個,如果是乙個,就代表連通圖;如果是兩個,就要加一條路才可以成為連通圖,以此類推。

這個演算法真的可以解決好多問題,好厲害的!!!

好的,不多說了,看下七段碼這道題:這道題目呢,就是要把所有的連成一片的燈的情況數找出來,乙個燈亮,它自己就算一片,幾個燈亮,就要求這幾個燈可以連起來成一片。

圖論的問題,聽著就複雜,但是有了並查集,喔,it』s ok~

首先呢,每個燈都是自己的祖先(自成一派),如果兩個燈之間有路,代表挨著,可連通,同時它倆又都亮著,這就是一片,那麼它倆就可以成一家人了,隨便選乙個做祖先(當家的),我們把所有亮著且連通著的燈都遍歷一遍,把可以放一家的都放一家,結束後再看整張圖里自己是自己的掌門人的燈有幾個,就代表有幾個連通分量,如果是1,就代表連成了一大片(當前某幾盞燈亮的情況下)

這個呢,就又用到了dfs,這裡我覺得好難想,我畫棧畫了好幾遍,才想明白這個深度遍歷是怎麼回事(小辣雞):大概是這個樣子的嗷

從dfs(1)開始進入,乙個乙個燈的點亮,壓棧,直到亮完7盞燈,然後開始看這時候的門派問題(能不能連成一片),然後出棧乙個,把7滅了燈,又壓棧來看門派,再出棧,這時候7的那個棧就完了,到了6是頂,執行完,滅了6,又進去點7,重複上述,等6完了,5到頂,執行完,滅了5,再進去點亮6,7,迴圈執行。巴拉巴拉。。。(好吧,我可能還是不會講題給別人聽)

大概的過程就是這樣了,然後還有乙個找祖先的函式,(因為不是乙個祖先,但是又聯通的是要合成一家的),也是個遞迴,一直找祖先是他自己的時候跳出,否則再找祖先的祖先。。。

好的,就這樣吧,我覺得我明白了,嗯,結束!

喔,忘了**,它來了

#include using namespace std;

//bool yueshu(int a,int b);

int ans=0;

int a[8][8];//連通性

int use[8];//是否開燈

int father[8];

int find_father(int n)

void dfs(int n)}}

int k=0;

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

if(k==1)

ans++;

return;

}use[n]=1;

dfs(n+1);

use[n]=0;

dfs(n+1);

}int main()

七段碼(dfs,並查集)

建圖,dfs 每個燈可以亮或者不亮,列舉2 7 include using namespace std const int n 8 int map n n fa n vis n ans intgetfa int i 尋找根節點 void dfs int k int cnt 0 for int i 1...

藍橋杯 七段碼

小藍要用七段碼數碼管來表示一種特殊的文字。上圖給出了七段碼數碼管的乙個圖示,數碼管中一共有 7 段可以發光的二極體,分別標記為 a,b,c,d,e,f,g。小藍要選擇一部分二極體 至少要有乙個 發光來表達字元。在設計字元的表達時,要求所有發光的二極體是連成一片的。例如 b 發光,其他二極體不發光可以...

藍橋杯 七段碼

題目描述 小藍要用七段碼數碼管來表示一種特殊的文字。上圖給出了七段碼數碼管的乙個圖示,數碼管中一共有 7 段可以發光的二 極管,分別標記為 a,b,c,d,e,f,g。小藍要選擇一部分二極體 至少要有乙個 發光來表達字元。在設計字元 的表達時,要求所有發光的二極體是連成一片的。例如 b 發光,其他二...