圖算法習題

通用匯點

算法導論22.1-6
思路:通用匯點k是鄰接矩陣中對應的那一行全爲0,對應的一列全爲1(akk=0除外),它知足這樣的條件:aik=0,akj=1(j!=k)。只要有aij=1,則i不多是通用匯點(通用匯點不能有出邊);若是aij=0,則j不多是(通用匯點必須有入邊)。這樣能夠想象爲從矩陣的左上角開始,查看aij的值,若是是1,則往下走;若是是0則往右走。直到超出了矩陣範圍。那麼超出範圍以前有兩種狀況:算法

  1. i=n-1且aij=1,這樣在走的過程當中,每一行至少有一個1,與「通用匯點k是鄰接矩陣中對應的那一行全爲0」矛盾,因此圖中不存在通用匯點;
  2. j=n-1且aij=0,這樣在走的過程當中,每一列至少有一個0且0~i-1行中每一行至少有一個1。相似1中的推論,k不多是[0,i-1]。 而因爲對於全部的p,存在知足q<=i的q,apq=0,則[i+1,n-1]不多是通用匯點,由於若是是,則與通用匯點「對應的一列全爲1(akk=0除外)」矛盾。因此只有此時的i多是通用匯點,在根據通用匯點的條件「通用匯點k知足這樣的條件:aik=0,akj=1(j! =k)」 最後判斷它是否是通用匯點。

設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必定會在直徑上,示意圖能夠參見圖:

證實第一次BFS獲得的點必定在直徑上的示意圖

  1. s在直徑上。用反證法證實:若是x不在直徑上,則根據第一次BFS有d(s,x)>d(s,m),從而有d(n,s,x)>d(n,s,m),即d(n,x)>d(n,m),這和mn是直徑的條件矛盾,因此x必定會在直徑上。
  2. s不在直徑上,且p(s,x)與p(m,n)相交。用反證法證實:若是x不在直徑上,設p(s,x)與p(m,n)相交於點w,根據第一次BFS有d(s,w,x)>d(s,w,m),即d(w,x)>d(w,m),從而d(n,w,x)>d(n,w,m),也就是存在mx路徑比直徑mn還要長,這與mn是直徑的條件矛盾。因此x必定會在直徑上。
  3. s不在直徑上,且p(s,x)不與p(m,n)相交。用反證法證實:因爲樹是連通圖,因此p(s,x)和p(m,n)必定會經過一條路徑相連,假設在p(s,x)上的點w和在p(m,n)上的點y之間有一條路徑。根據第一次BFS有d(s,w,x)>d(s,w,y,m),即d(w,x)>d(w,y,m),因此d(n,y,w,x)>d(n,y,m),這和mn是直徑的條件矛盾,因此x必定會在直徑上。

證實了點x在直徑上面,則x必定會是直徑上的一個端點。由於第一次BFS獲得的x必定是度爲1(至關於葉節點)的點,不然與x是距離s 最遠的點矛盾。

由於點x是直徑的一個端點,因此第二次BFS以x爲起始點進行BFS,獲得的最大距離就是樹的直徑。

相關文章
相關標籤/搜索