演算法導論22 2 6 好選手 壞選手問題

2021-06-11 03:26:42 字數 929 閱讀 8113

q:有兩種型別的職業摔跤選手:一種是好「選手」,一種是壞「選手」。對於任意一對摔跤職業選手來說,他們中可能有,也可能沒有比賽。假定有n位摔跤職業選手,並且有乙份清單,上面列出了r對參加比賽的摔跤手。試給出乙個o(n+r)時間的演算法,它能否確定是否指定某些摔跤手為好選手,而將餘下的摔跤手指定為壞選手,從而使得每一場比賽都是在乙個好選手與乙個壞選手之間進行。如果有可能做出這樣的指定,你的演算法就應該將它產生出來。

一、等價於判斷圖是否為二分圖(二著色)的問題

二分圖,就是頂點集v可分割為兩個互不相交的子集,並且圖中每條邊依附的兩個節點都分屬於這兩個互不相交的子集。如下圖所示:

二、判斷這個圖是不是二分圖

將好選手歸為一類,壞選手歸為一類。

若是某個圖為二分圖的話,當且僅當圖中所有的迴路都為偶數個頂點,頂點個數至少為2。因此,判斷圖中是否存在有奇數個頂點的迴路即可。判斷方法:

1、深度(或廣度)優先搜尋中,若兩個灰色節點有邊連線,且二者的深度(到根節點的距離)之和為偶數,則表明存在有奇數個頂點的迴路,即該圖不是二分圖。

2、如果該圖沒有迴路,那一定是可以二分的;若有迴路,則迴路中節點的度數一定 >=2。

統計每個節點的度數;

刪除所有度數<1的節點(將該節點對應的邊刪除,並將對應的頂點的度數-1);

然後將更新後的頂點度數為1的所有點加入佇列當中,對佇列中的每個元素重複上一步,即刪除度數為1的點。最後如果還有沒有被刪除的節點(即還存在度數》=2的節點),證明圖中存在迴路。如果全部都已刪除則圖中不存在迴路,即圖是二分的;

如果存在迴路,對剩下的每乙個節點,統計從這個節點開始的所有迴路(dfs),並記錄路徑的長度,標記訪問狀態,如果存在奇數邊迴路就表明不是二分圖。否則,執行直到所有節點都被訪問完畢。

FZU 2226 信心題 莫隊演算法

problem 2226 信心題 給定乙個含有n個數字的數列,每個數字都有乙個值a i 下標從1開始 定義第i個數字和第j個數字間的距離dis i,j abs i j 資料範圍 n 10 5 q 10 4 1 a i 10 3 1 l r n 注意到a i 小於1000,所以我們如果我們可以得到每種...

分治演算法 選手日程表設計

有n n 2k 個運動員要進行網球迴圈賽,alice和bob要為他們設計乙個滿足以下要求的比賽日程表 每個選手必須與其他n 1個選手各賽一次 每個選手一天只能賽一次 迴圈賽一共進行n 1天 輸入為k 請為他們設計演算法。樣例輸入 1樣例輸出 1 22 1 演算法描述 先初始化乙個兩個選手的比賽日程表...

演算法導論 隨機演算法

一.概率分布 對於有些問題本身是屬於概率問題,如僱傭問題 對於此類問題,我們需要利用概率分析來得到演算法的執行時間,有時也用來分析其他的量。例如,僱傭問題中的費用問題也需要結合概率分析來計算得到。為了使用概率分析,我們必須使用或者假設已知關於輸入的概率分布,然後通過分析該演算法計算出平均情況下的執行...