題意:有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 #include4using
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,若存在多個答案相同,則輸出矩陣字典序最小的乙個。先從第一行開始反轉,利用二進位制...