算法導論22.1-6
思路:通用匯點k是鄰接矩陣中對應的那一行全爲0,對應的一列全爲1(akk=0除外),它知足這樣的條件:aik=0,akj=1(j!=k)。只要有aij=1,則i不多是通用匯點(通用匯點不能有出邊);若是aij=0,則j不多是(通用匯點必須有入邊)。這樣能夠想象爲從矩陣的左上角開始,查看aij的值,若是是1,則往下走;若是是0則往右走。直到超出了矩陣範圍。那麼超出範圍以前有兩種狀況:算法
設n爲點的個數,判斷是否存在通用匯點見下面的算法.
指針
上面的算法在矩陣中指針遊走時,無論aij取值是0仍是1,都能使得i指針或者j指針前移,最多花費2n的時間到達鄰鄰接矩陣外部,這樣在O(V)的時間內是能完成判斷的。而當肯定i了以後,有兩個並列的循環,它們分別耗費時間爲O(n),因此整體耗費時間也是O(n)。blog
算法導論22.2-7循環
把有競爭關係的對手之間連上邊,則題目能夠轉換爲設有紅藍兩色,是否存在一顆廣度優先樹,它的每一層的顏色都不一樣。遍歷
先利用給定信息構建鄰接表,耗費的時間複雜度是O(n+r)。而後以第一個節點(定爲紅色)爲源點進行廣度優先遍歷,對於鄰接表中的Adj[u]裏的每一個節點v,若是u的顏色是紅色,
1)v未處理,則將v置爲藍色;
2)若是v是紅色,則衝突,返回false;
3)若是v是藍色,則可不作處理。
反之,若是u是藍色,則依次類推。
另外增長一個白色表明未處理。im
適當修改書中的廣度優先遍歷算法BFS,獲得給圖着色的算法:
d3
若是算法返回的true,則根據顏色將點分爲兩類,也就是把選手分爲娃娃臉和高跟鞋兩類。img
綜上,構造鄰接表所需的時間爲O(n+r),着色複雜度爲O(n+r),根據已有的着色來進行分類的複雜度爲O(n)。因此整體的複雜度爲O(n+r)。時間
算法導論22.2-8co
先以任意一點s做爲源點進行廣度優先遍歷,而後找到距離s的點x,再以x爲源點進行廣度優先遍歷,獲得的最大距離便是樹的直徑,見下面的算法。算法調用BFS的複雜度爲O(V+E),找到最大的d,複雜度爲O(V),因此整體的複雜度爲O(V+E)。
下面證實通過兩次BFS獲得的必定是最長的距離。第一次BFS的起點和終點分別是s和x,設真正的直徑端點爲m和n,p(s,x)表明s走到x的路徑,d(a,b,c)表明通過a、b、c三點的路徑的長度。 根據s 是否在直徑上和p(s,x)是否和直徑相交分爲三種狀況討論,證實x必定會在直徑上,示意圖能夠參見圖:
證實了點x在直徑上面,則x必定會是直徑上的一個端點。由於第一次BFS獲得的x必定是度爲1(至關於葉節點)的點,不然與x是距離s 最遠的點矛盾。
由於點x是直徑的一個端點,因此第二次BFS以x爲起始點進行BFS,獲得的最大距離就是樹的直徑。