UVa 818 切斷圓環鏈(dfs 二進位制列舉)

2022-06-20 23:36:09 字數 1136 閱讀 7308

題意:有n個圓環,其中有一些已經扣在了一起。現在需要開啟盡量少的圓環,使得所有圓環可以組成一條鏈,例如,有5個圓環,1-2,2-3,4-5,則需要開啟乙個圓環,如圓環4,然   後用它穿過圓環3和圓環5後再次閉合4,就可以形成一條鏈:1-2-3-4-5。

思路:從n個圓環中任意選擇圓環,這就是列舉子集。所以這道題目可以用二進位制列舉來做。

那麼如何判斷當前開啟圓環是可行的呢?在去除開啟的圓環後需要判斷:

①:每個圓環的分支數都必須小於等於2,大於2個肯定就不能成為單鏈了。

②:不能存在環。

③:連通分支數-1不能大於開啟圓環數。

判斷是否存在圓環和連通分支數都可以用dfs來實現。

1 #include2 #include3 #include4

using

namespace

std;56

intn,cnt,number;

7int map[20][20];8

int vis[20];9

intans;

1011

bool two(int s) //

判斷是否有分支數大於2的圓環

1224}25

}26return

false;27

}2829bool dfs(int x,int f,int s) //

判斷是否有迴路存在

3040}41

return

false;42

}4344bool circle(int

s)4554}

55return

false;56

}5758int calc(int s) //

計算出開啟圓環的個數

5965

return

cnt;66}

6768

void

solve()

6978}79

80int

main()

8192

solve();

93 cout<<"

set

"<<++kase<<"

: minimum links to open is

"95return0;

96 }

二進位制dfs

思路 題目大意為給你一根柱子,切成n段,2 n 8 每段的左右兩個截面分別有數字u,v,1 u v 6 當兩個截面上的數字相同時則這兩個截面可以拼接起來。輸入n,再輸入n組u v,第i組表示第i段柱子上左右截面上的數,柱段可以反轉拼接。問如何拼接。dfs暴力,用2進製例舉每個位置上的柱子反轉的情況。...

POJ 1753 Flip Game 二進位制列舉

題型 列舉 題意 4 4的棋盤上面放了16盞燈,有黑有亮。每次按乙個燈,會改變本身及其上下左右四個燈的狀態,即黑變白或白變黑,問最少需要按幾次,可以將所有燈變為同一種狀態,不能變則輸出 impossible 分析 如果按個多個燈,可以發現,這些操作的順序是互不影響的。對於每個燈,按一次翻轉,再按一次...

Poj 3279Fliptile 二進位制列舉)

題目傳送門 題意 給定0,1矩陣,每次反轉乙個位置,它相鄰的四個位置也會反轉 如果存在的話 反轉的意思就是1 0或者1 0,問最少反轉多少個位置就可以使矩陣全部變成0。最後輸出乙個矩陣,所有反轉的位置輸出1,否則輸出0,若存在多個答案相同,則輸出矩陣字典序最小的乙個。先從第一行開始反轉,利用二進位制...