❶ 求解:圖論中常見的最短路徑演算法有幾種都是什麼
主要是有三種、、
第一種是最直接的貪心dijkstra演算法、、可以利用堆數據結構進行優化、、缺點就是不能求有負權的最短路與判斷負環、、
第二種是bellman-ford演算法、、根據鬆弛操作的性質是可以來判斷負環的、、時間復雜度是O(nm)的、、
第三種是SPFA演算法、、把他單獨拿出來作為一種演算法並不是非常好的、、他的實質應該是上面的bellman-ford演算法的隊列優化時間復雜度更低、O(KE)、K的值約等於2、、
❷ "最短路徑優先演算法"的優缺點
所謂的最短路徑問題有很多種意思,
在這里啟發式指的是一個在一個搜尋樹的節點上定義的函數h(n),用於評估從此節點到目標節點最便宜的路徑。啟發式通常用於資訊充分的搜尋演算法,例如最好優先貪婪演算法與a*。最好優先貪婪演算法會為啟發式函數選擇最低代價的節點;a*則會為g(n)
+
h(n)選擇最低代價的節點,此g(n)是從起始節點到目前節點的路徑的確實代價。如果h(n)是可接受的(admissible)意即h(n)未曾付出超過達到目標的代價,則a*一定會找出最佳解。
最能感受到啟發式演算法好處的經典問題是n-puzzle。此問題在計算錯誤的拼圖圖形,與計算任兩塊拼圖的曼哈頓距離的總和以及它距離目的有多遠時,使用了本演算法。注意,上述兩條件都必須在可接受的范圍內。
❸ 實現最小生成樹和最短路徑的演算法(matlab)
graphminspantree, 最小生成樹
graphshortestpath, 一條最短路徑
graphallshortestpaths, 所有最短路徑
❹ OSPF協議中,最短路徑樹是如何計算的哪個設備是最短路徑樹的根
最短路徑是Dijkstra演算法,可以看《數據結構》中相關演算法篇幅,或者參考網路中的「Dijkstra演算法」http://ke..com/view/7839.htm
每一台路由器都已自己為根節點來使用SPF算來計算路由。
❺ 權圖中求最短路徑都有哪些演算法
帶權圖也分有向和無向兩種,基本的演算法可以看看書咯。
帶權的無向圖的最短路徑又叫最小生成樹,Prim演算法和Kruskal演算法;
帶權的有向圖的最短路徑演算法有迪傑斯特拉演算法和佛洛依德演算法;
❻ 有沒有做演算法的人最短路徑樹SPT有哪些演算法
IP 組播技術實現了 IP 網路中點到多點的高效數據傳送。因為組播能夠有效地節約網路帶寬、降低網路負載,所以在實時數據傳送、多媒體會議、數據拷貝、游戲和模擬等諸多方面都有廣泛的應用。本文介紹了組播的基本概念和目前通用的組播協議,以及組播組網的基本方案;並針對組播業務需求和運營過程中面臨的問題,提出了電信級的可運營、可管理的「受控組播」解決方案,包括信源管理、用戶管理和組播安全控制等方面的內容。
關鍵詞
組播 運營管理 受控組播 IGMP DVMRP PIM-SM PIM-DM MBGP MSDP
1 組播概述
1.1組播技術的產生原因
傳統的IP通信有兩種方式:第一種是在一台源 IP 主機和一台目的 IP 主機之間進行,即單播(unicast);第二種是在一台源 IP 主機和網路中所有其它的 IP 主機之間進行,即廣播(broadcast)。如果要將信息發送給網路中的多個主機而非所有主機,則要麼採用廣播方式,要麼由源主機分別向網路中的多台目標主機以單播方式發送 IP 包。採用廣播方式實現時,不僅會將信息發送給不需要的主機而浪費帶寬,也可能由於路由回環引起嚴重的廣播風暴;採用單播方式實現時,由於 IP 包的重復發送會白白浪費掉大量帶寬,也增加了伺服器的負載。所以,傳統的單播和廣播通信方式不能有效地解決單點發送多點接收的問題。
IP 組播是指在 IP 網路中將數據包以盡力傳送(best-effort)的形式發送到網路中的某個確定節點子集,這個子集稱為組播組(multicast group)。IP 組播的基本思想是,源主機只發送一份數據,這份數據中的目的地址為組播組地址;組播組中的所有接收者都可接收到同樣的數據拷貝,並且只有組播組內的主機(目標主機)可以接收該數據,網路中其它主機不能收到。組播組用 D 類 IP 地址(224.0.0.0 ~ 239.255.255.255)來標識。
1.2組播技術的市場前景
IP 組播技術有效地解決了單點發送多點接收的問題,實現了 IP 網路中點到多點的高效數據傳送,能夠大量節約網路帶寬、降低網路負載。作為一種與單播和廣播並列的通信方式,組播的意義不僅在於此。更重要的是,可以利用網路的組播特性方便地提供一些新的增值業務,包括在線直播、網路電視、遠程教育、遠程醫療、網路電台、實時視頻會議等互聯網的信息服務領域。
組播從 1988 年提出到現在已經經歷了十幾年的發展,許多國際組織對組播的技術研究和業務開展進行了大量的工作。隨著互聯網建設的迅猛發展和新業務的不斷推出,組播也必將走向成熟。盡管目前端到端的全球組播業務還未大規模開展起來,但是具備組播能力的網路數目在增加。一些主要的 ISP 已運行域間組播路由協議進行組播路由的交換,形成組播對等體。在 IP 網路中多媒體業務日漸增多的情況下,組播有著巨大的市場潛力,組播業務也將逐漸得到推廣和普及。
2 組播技術的基本原理
組播技術涵蓋的內容相當豐富,從地址分配、組成員管理,到組播報文轉發、路由建立、可靠性等諸多方面。下面首先介紹組播協議體系的整體結構,之後從組播地址、組播成員管理、組播報文轉發、域內組播路由和域間組播路由等幾個方面介紹有代表性的協議和機制。
2.1組播協議體系結構
根據協議的作用范圍,組播協議分為主機-路由器之間的協議,即組播成員管理協議,以及路由器-路由器之間協議,主要是各種路由協議。組成員關系協議包括 IGMP(互連網組管理協議);組播路由協議又分為域內組播路由協議及域間組播路由協議兩類。域內組播路由協議包括 PIM-SM、PIM-DM、DVMRP 等協議,域間組播路由協議包括 MBGP、MSDP 等協議。同時為了有效抑制組播數據在二層網路中的擴散,引入了 IGMP Snooping 等二層組播協議。
通過 IGMP 和二層組播協議,在路由器和交換機中建立起直聯網段內的組成員關系信息,具體地說,就是哪個介面下有哪個組播組的成員。域內組播路由協議根據 IGMP 維護的這些組播組成員關系信息,運用一定的組播路由演算法構造組播分發樹,在路由器中建立組播路由狀態,路由器根據這些狀態進行組播數據包轉發。域間組播路由協議根據網路中配置的域間組播路由策略,在各自治系統(AS,Autonomous System)間發布具有組播能力的路由信息以及組播源信息,使組播數據能在域間進行轉發。
2.2組播地址機制
2.2.1組播IP地址
IP組播地址用於標識一個 IP 組播組。IANA 把 D 類地址空間分配給組播使用,范圍從 224.0.0.0 到 239.255.255.255。如下圖所示(二進製表示),IP 組播地址前四位均為「1110」。
2.2.2組播地址的劃分
整個 IP 組播地址的空間劃分如下圖所示。
其中:
224.0.0.0 到 224.0.0.255 地址范圍被 IANA 預留,地址 224.0.0.0 保留不做分配,其它地址供路由協議及拓撲查找和維護協議使用。該范圍內的地址屬於局部范疇,不論生存時間欄位(TTL)值是多少,都不會被路由器轉發;
224.0.1.0 到 238.255.255.255 地址范圍作為用戶組播地址,在全網范圍內有效。其中233/8 為 GLOP 地址。GLOP 是一種自治系統之間的組播地址分配機制,將 AS 號直接填入組播地址的中間兩個位元組中,每個自治系統都可以得到 255 個組播地址;
239.0.0.0 到 239.255.255.255 地址范圍為本地管理組播地址(***istratively scoped addresses),僅在特定的本地范圍內有效。
當 IP 層收到組播數據報文時,根據組播目的地址查找組播轉發表,對報文進行轉發。
2.2.3IP 組播地址到 MAC 地址的映射
IANA 將 MAC 地址范圍 01:00:5E:00:00:00 ~ 01:00:5E:7F:FF:FF 分配給組播使用,這就要求將28位的 IP 組播地址空間映射到 23 位的 MAC 地址空間中,具體的映射方法是將組播地址中的低 23 位放入 MAC 地址的低 23 位,如下圖所示。
由於 IP 組播地址的後 28 位中只有 23 位被映射到 MAC 地址,這樣會有 32 個 IP 組播地址映射到同一 MAC 地址上。
2.3組播成員管理
2.3.1IGMP ( Internet Group Management Protocol )
IGMP 協議運行於主機和與主機直接相連的組播路由器之間,IGMP 實現的功能是雙向的:一方面,通過 IGMP 協議,主機通知本地路由器希望加入並接收某個特定組播組的信息;另一方面,路由器通過 IGMP 協議周期性地查詢區域網內某個已知組的成員是否處於活動狀態(即該網段是否仍有屬於某個組播組的成員),實現所連網路組成員關系的收集與維護。通過 IGMP,在路由器中記錄的信息是某個組播組是否在本地有組成員,而不是組播組與主機之間的對應關系。
到目前為止,IGMP 有三個版本。IGMPv1(RFC1112)中定義了基本的組成員查詢和報告過程;目前通用的是 IGMPv2,由 RFC2236 定義,在 IGMPv1 的基礎上添加了組成員快速離開的機制;IGMPv3 中增加的主要功能是成員可以指定接收或指定不接收某些組播源的報文。以下著重介紹 IGMPv2 協議的原理。
IGMPv2 的原理如下圖所示:
當同一個網段內有多個組播路由器時,IGMPv2 通過查詢器選舉機制從中選舉出唯一的查詢器。查詢器周期性地發送通用組查詢消息進行成員關系查詢;主機發送報告消息來響應查詢。主機發送報告消息的時間有隨機性,當檢測到同一網段內有其它成員發送同樣的消息時,則抑制自己的響應報文。如果有新的主機要加入組播組,不必等待查詢器的查詢消息,而是主動發送報告消息。當要離開組播組時,主機發送離開組消息;收到離開組消息後,查詢器發送特定組查詢消息來確定是否所有組成員都已離開。對於作為組成員的路由器而言,其行為和普通的主機一樣,響應其它路由器的查詢。
通過上述機制,在組播路由器里建立起一張表,其中記錄了路由器的各個介面所對應的子網上都有哪些組的成員。當路由器接收到某個組 G 的數據報文後,只向那些有 G 的成員的介面上轉發數據報文。至於數據報文在路由器之間如何轉發則由路由協議決定,不是 IGMP 協議的功能。
2.3.2二層環境中組成員管理的實現
IGMP 組播成員管理機制是針對第三層設計的,在第三層,路由器可以對組播報文的轉發進行控制,只要進行適當的介面配置和對 TTL 值的檢測就可以了。但是在很多情況下,組播報文要不可避免地經過一些二層交換設備,尤其是在區域網環境里。如果不對二層設備進行相應的配置,則組播報文就會轉發給二層交換設備的所有介面,這顯然會浪費大量的系統資源。IGMP 監聽(IGMP Snooping)可以解決這個問題。
IGMP 監聽的工作原理如下:
主機發出 IGMP 成員報告消息,這個消息是給路由器的;在 IGMP 成員報告經過交換機時,交換機對這個消息進行監聽並記錄下來,形成組成員和介面的對應關系;
交換機在收到組播數據報文時,根據組成員和介面的對應關系,僅向具有組成員的介面轉發組播報文。
IGMP 監聽可以解決二層環境中的組播報文泛濫問題,但要求交換機具有提取第三層信息的功能;其次,要求交換機對所有的組播報文進行監聽和解讀,這會產生很多的無效工作;此外,組播報文監聽和解讀工作也會佔用大量的 CPU 處理時間。
2.4組播報文轉發
與單播報文的轉發相比,組播報文的轉發相對復雜。一方面,組播路由類型與單播路由不同,是點到多點的一棵路由樹;另一方面組播報文轉發的處理過程也有所不同。
2.4.1組播路由的分類
組播路由可以分為兩大類:信源樹(Source Tree)和共享樹(Shared Tree)。信源樹是指以組播源作為樹根,將組播源到每一個接收者的最短路徑結合起來構成的轉發樹。由於信源樹使用的是從組播源到接收者的最短路徑,因此也稱為最短路徑樹(shor*** path tree,SPT)。對於某個組,網路要為任何一個向該組發送報文的組播源建立一棵樹。 共享樹以某個路由器作為路由樹的樹根,該路由器稱為匯集點(Rendezvous Point,RP),將 RP 到所有接收者的最短路結合起來構成轉發樹。使用共享樹時,對應某個組,網路中只有一棵樹。所有的組播源和接收者都使用這棵樹來收發報文,組播源先向樹根發送數據報文,之後報文又向下轉發到達所有的接收者。
信源樹的優點是能構造組播源和接收者之間的最短路徑,使端到端的延遲達到最小;但是付出的代價是,在路由器中必須為每個組播源保存路由信息,這樣會佔用大量的系統資源,路由表的規模也比較大。共享樹的最大優點是路由器中保留的狀態數可以很少,缺點是組播源發出的報文要先經過 RP,再到達接收者,經由的路徑通常並非最短,而且對 RP 的可靠性和處理能力要求很高。
2.4.2組播報文轉發過程
單播報文的轉發過程中,路由器並不關心組播源地址,只關心報文中的目的地址,通過目的地址決定向哪個介面轉發。在組播中,報文是發送給一組接收者的,這些接收者用一個邏輯地址標識。路由器在接收到報文後,必須根據源和目的地址確定出上游(指向組播源)和下遊方向,把報文沿著遠離組播源的方向進行轉發。這個過程稱作 RPF(Reverse Path Forwarding,逆向路徑轉發)。
RPF 執行過程中會用到原有的單播路由表以確定上游和下游的鄰接結點。只有當報文是從上游鄰接結點對應的介面(稱作 RPF 介面)到達時,才向下游轉發。RPF 的作用除了可以正確地按照組播路由的配置轉發報文外,還能避免由於各種原因造成的環路,環路避免在組播路由中是一個非常重要的問題。RPF 的主體是 RPF 檢查,路由器收到組播報文後,先對報文進行 RPF 檢查,只有檢查通過才轉發,否則丟棄。RPF 檢查過程如下:
1)路由器在單播路由表中查找組播源或 RP 對應的 RPF 介面(當使用信源樹時,查找組播源對應的 RPF 介面,使用共享樹時查找 RP 對應的 RPF 介面),某個地址對應的 RPF 介面是指從路由器向該地址發送報文時的出介面;
2)如果組播報文是從 RPF 介面接收下來的,則 RPF 檢查通過,報文向下游介面轉發;
3)否則,丟棄該報文。
2.5域內組播路由協議
與單播路由一樣,組播路由也分為域內和域間兩大類。域內組播路由目前已經討論的相當成熟,在眾多的域內路由協議中,DVMRP(距離矢量組播路由協議)、PIM-DM(密集模式協議無關組播)和PIM-SM(稀疏模式協議無關組播)是目前應用最多的協議。
2.5.1DVMRP(Distance Vector Multicast Routing Protocol)
DVMRP 是第一個在 MBONE 上得到普遍使用的組播路由協議,它在 RIP 協議的基礎上擴充了支持組播的功能。DVMRP 協議首先通過發送探測消息來進行鄰居發現,之後通過路由交換來進行單播尋徑和確定上下游依賴關系。
DVMRP 採用逆向路徑組播(RPM)演算法進行組播轉發。當組播源第一次發送組播報文時,使用截斷逆向路徑組播(truncated RPM)演算法沿著源的組播分發樹向下轉發組播報文。當葉子路由器不再需要組播數據包時,它朝著組播源發送剪枝消息,對組播分發樹進行剪枝,藉此除不必要的通信量。上游路由器收到剪枝消息後將收到此消息的介面置為剪枝狀態,停止轉發數據。剪枝狀態關聯著超時定時器,當定時器超時時,剪枝狀態又重新變為轉發狀態,組播數據再次沿著這些分支流下。另外,當剪枝區域內出現了組播組成員時,為了減少反應時間,下游不必等待上游剪枝狀態超時,而是主動向上游發送嫁接報文,以使剪枝狀態變為轉發狀態。可見,DVMRP 是由數據觸發驅動,建立組播路由表,而路由樹的建立過程可以概括為「擴散與剪枝」(Broadcast and Prune)。轉發特點可以概括為「被動接受,主動退出」。
另外,在多路訪問網路中,當有兩個或多個的組播路由器時,網路上可能會重復轉發包。為了防止這種情況出現,在多路訪問網路上,DVMRP 為每個源選擇了一個唯一的轉發器。
2.5.2PIM-DM(Protocol Independent Multicast Dense Mode)
在 PIM-DM 域中,運行 PIM-DM 協議的路由器周期性的發送 Hello 消息,發現鄰接的 PIM 路由器,進行葉子網路、葉子路由器的判斷,並且負責在多路訪問網路中選舉指定路由器(DR)。
PIM-DM 協議使用下面的假設:當組播源開始發送組播數據時,域內所有的網路節點都需要接收數據,因此採用「擴散-剪枝」的方式進行組播數據包的轉發。組播源開始發送數據時,沿途路由器向除組播源對應的 RPF 介面之外的所有介面轉發組播數據包。這樣,PIM-DM 域中所有網路節點都會收到這些組播數據包。為了完成組播轉發,沿途的路由器需要為組 G 和源 S 創建相應的組播路由項 (S, G)。 (S, G) 路由項包括組播源地址、組播組地址、入介面、出介面列表、定時器和標志等。
如果網路中某區域沒有組播組成員,該區域內的路由器會發送剪枝消息,將通往該區域的轉發介面剪枝,並且建立剪枝狀態。剪枝狀態對應著超時定時器。當定時器超時時,剪枝狀態又重新變為轉發狀態,組播數據得以再次沿著這些分支流下。另外,剪枝狀態包含組播源和組播組的信息。當剪枝區域內出現了組播組成員時,為了減少反應時間,協議不必等待上游剪枝狀態超時,而是主動向上游發送嫁接報文,以使剪枝狀態變為轉發狀態。
2.5.3PIM-SM(Protocol Independent Multicast Sparse Mode)
在 PIM-SM 域中,運行 PIM-SM 協議的路由器周期性的發送 Hello 消息,用以發現鄰接的 PIM 路由器,並且負責在多路訪問網路中進行 DR 的選舉。這里,DR 負責為與其直連的組成員向組播樹根節點的方向發送「加入/剪枝」消息,或是將直連組播源的數據發向組播分發樹。
PIM-SM 通過建立組播分發樹來進行組播數據包的轉發。組播分發樹分為兩種:以組 G 的 RP 為根的共享樹和以組播源為根的最短路徑樹。PIM-SM 通過顯式的加入/剪枝機制來完成組播分發樹的建立與維護。
PIM-SM 中還涉及到 RP 的選擇機制。在 PIM-SM 域內配置了一個或多個候選自舉路由器(Candidate-BSR)。使用一定的規則從中選出自舉路由器 (BSR) 。PIM-SM 域中還配置有候選 RP 路由器(Candidate-RP),這些候選 RP 將包含了它們地址及可以服務的組播組等信息的報文單播發送給自舉路由器,再由 BSR 定期生成包括一系列候選 RP 以及相應的組地址的「自舉」消息。「自舉」消息在整個域中逐跳發送。路由器接收並保存這些「自舉」消息。若 DR 從直連主機收到了 IGMP 加入報文後,如果它沒有這個組的路由項,將使用 hash 演算法將組地址映射到一個候選 RP。然後朝 RP 方向逐跳組播「加入/剪枝」消息。若 DR 從直連主機收到組播數據包,如果它沒有這個組的路由項,也將使用 hash 演算法將組地址映射到一個候選 RP,然後將組播數據封裝在注冊消息中單播發送到 RP。
在多路訪問網路中,PIM-SM 還引入了以下機制:使用斷言機制選舉唯一的轉發者,以防向同一網段重復轉發組播數據包;使用加入/剪枝抑制機制減少冗餘的加入/剪枝消息;使用剪枝否決機制否決不應有的剪枝行為。
2.6域間組播路由協議
域間組播目前仍然處於研究和試驗階段,目前比較成型的解決方案是下面三個協議的組合:
MBGP(組播邊界網關協議),用於在自治域之間交換組播路由信息;MSDP(組播信源發現協議),用於在 ISP 之間交換組播信源信息;PIM-SM,用作域內的組播路由協議。
PIM-SM 前文已經介紹,這里重點介紹 MBGP 和 MSDP,以及 PIM-SM / MBGP / MSDP 組合方案的工作過程。
2.6.1MBGP(MultiProtocol Border Gateway Protocol)
域間路由的首要問題是路由信息(或者說可達信息)如何在自治系統之間傳遞,由於不同的 AS 可能屬於不同的運營商,因此除了距離信息外,域間路由信息必須包含運營商的策略,這是與域內路由信息的不同之處。
目前使用最多的域間單播路由協議是 BGP-4。為了實現域間組播路由信息的傳遞,必須對 BGP 進行改動,因為組播的網路拓撲和單播拓撲有可能不同。這里既有物理方面的原因,也有策略方面的原因。網路中的一些路由器可能只支持單播不支持組播,也可能按照策略配置不轉發組播報文。為了構造域間組播路由樹,除了要知道單播路由信息外,還要知道網路中哪些部分是支持組播的,即組播的網路拓撲情況。簡而言之,域間的組播路由信息交換協議應該滿足下面的要求:
能對單播和組播拓撲進行區分;
有一套穩定的對等和策略控制方法。
BGP-4 已經滿足後一個條件,而且已經被證明是一個有效的、穩定的單播域間路由協議,因此合理的解決方案是對 BGP-4 協議進行增強和擴展,而不是構建一套全新的協議。在 RFC2858 中規定了對 BGP 進行多協議擴展的方法,擴展後的 BGP 協議(MBGP,也寫作 BGP-4+)不僅能攜帶 IPv4 單播路由信息,也能攜帶其它網路層協議(如組播、IPv6 等)的路由信息,攜帶組播路由信息只是其中一個擴展功能。
有了 MBGP 之後,單播和組播路由信息可以通過同一個進程交換,但是存放在不同的路由表裡。由於 MBGP 是 BGP-4 協議的一個增強版,因此 BGP-4 所支持的常見的策略和配置方法都可以用到組播里。
2.6.2MSDP(Multicast Source Discovery Protocol)
對於 ISP 來說,不希望依靠競爭對手的 RP 轉發組播流量,但同時又要求無論信源的 RP 在哪裡,都能從信源獲取信息發給自己內部的成員。MSDP 就是為了解決這個問題而提出的。在 MSDP 里使用的是域間信源樹而不是公共樹,而且要求域內組播路由協議必須是 PIM-SM。
在 MSDP 中,某個域內的 RP 使用 TCP 連接與其它域內的 RP 建立 MSDP 對等關系,用這些對等關系交換信源信息。如果本地的接收者要接收其它域的信源發出的報文,則使用與 PIM-SM 中同樣的方法構造信源樹。
PIM-SM / MBGP / MSDP 組合方案實際上是 PIM-SM 協議在域間環境下的擴展。如果把整個 PIM-SM / MBGP / MSDP 組合方案機制看作 PIM-SM,則所有域的 RP 的集合就是 PIM-SM 協議中的「RP」,而 PIM-SM / MBGP / MSDP 無非是增加了兩個過程:
1、信源信息在 RP 集合中的泛濫,以實現信源和成員在「RP」點的會合;
2、域間組播路由信息的傳遞,目的是保證組播報文在域間的順利轉發。在上述過程中,AS3 中的 RP 和收端向 AS2 中的遠端建立逆向路徑的過程中都需要用到 MBGP 傳遞的組播拓撲信息。
❼ 最短路徑和最小生成樹分別對應什麼演算法,兩者區別是什
最小生成樹是用和最少的邊集將一個圖連成任意2點可達,並且這個邊集的總長度最小。最短路徑是一個圖中2個點的最短距離。完全不是一個概念。
那也不一樣啊,一點到其餘各點的路徑和最小,就是一點到其它點的最短路徑和。差的太遠了。
比如這樣一個圖(邊權已標出)
******4
*****v--v
****5 \ / 3
*******v
****2 / \ 4
*****v v
最小生成樹為
****v--v
******/
*****v
****/ \
***v v
總長為4+3+2+4=13
中間那個點到各點的最短路徑為5+2+3+4=14
顯然不一樣啊,反例太多了,舉了一種。
❽ 鏈路狀態路由協議運行什麼演算法來計算到達目的網路的最短路徑
一、RIP協議RIP(RoutinginformationProtocol)是應用較早、使用較普遍的內部網關協議(InteriorGatewayProtocol,簡稱IGP),適用於小型同類網路,是典型的距離向量(distance-vector)協議。文檔見RFC1058、RFC1723。RIP通過廣播UDP報文來交換路由信息,每30秒發送一次路由信息更新。RIP提供跳躍計數(hopcount)作為尺度來衡量路由距離,跳躍計數是一個包到達目標所必須經過的路由器的數目。如果到相同目標有二個不等速或不同帶寬的路由器,但跳躍計數相同,則RIP認為兩個路由是等距離的。RIP最多支持的跳數為15,即在源和目的網間所要經過的最多路由器的數目為15,跳數16表示不可達。1.有關命令任務命令指定使用RIP協議routerrip指定RIP版本version{1|2}1指定與該路由器相連的網路networknetwork註:1.Cisco的RIP版本2支持驗證、密鑰管理、路由匯總、無類域間路由(CIDR)和變長子網掩碼(VLSMs)二、IGRP協議IGRP()是一種動態距離向量路由協議,它由Cisco公司八十年代中期設計。使用組合用戶配置尺度,包括延遲、帶寬、可靠性和負載。預設情況下,IGRP每90秒發送一次路由更新廣播,在3個更新周期內(即270秒),沒有從路由中的第一個路由器接收到更新,則宣布路由不可訪問。在7個更新周期即630秒後,CiscoIOS軟體從路由表中清除路由。1.有關命令任務命令指定使用RIP協議routerigrpautonomous-system1指定與該路由器相連的網路networknetwork指定與該路由器相鄰的節點地址neighborip-address註:1、autonomous-system可以隨意建立,並非實際意義上的autonomous-system,但運行IGRP的路由器要想交換路由更新信息其autonomous-system需相同。三、OSPF協議OSPF(OpenShortestPathFirst)是一個內部網關協議(InteriorGatewayProtocol,簡稱IGP),用於在單一自治系統(autonomoussystem,AS)內決策路由。與RIP相對,OSPF是鏈路狀態路有協議,而RIP是距離向量路由協議。鏈路是路由器介面的另一種說法,因此OSPF也稱為介面狀態路由協議。OSPF通過路由器之間通告網路介面的狀態來建立鏈路狀態資料庫,生成最短路徑樹,每個OSPF路由器使用這些最短路徑構造路由表。文檔見RFC2178。1.有關命令全局設置任務命令指定使用OSPF協議routerospfprocess-id1指定與該路由器相連的網路networkaddresswildcard-maskareaarea-id2指定與該路由器相鄰的節點地址neighborip-address註:1、OSPF路由進程process-id必須指定范圍在1-65535,多個OSPF進程可以在同一個路由器上配置,但最好不這樣做。多個OSPF進程需要多個OSPF資料庫的副本,必須運行多個最短路徑演算法的副本。process-id只在路由器內部起作用,不同路由器的process-id可以不同。2、wildcard-mask是子網掩碼的反碼,網路區域IDarea-id在0-4294967295內的十進制數,也可以是帶有IP地址格式的x.x.x.x。當網路區域ID為0或0.0.0.0時為主幹域。不同網路區域的路由器通過主幹域學習路由信息。
❾ sh實現最小生成樹和最短路徑的演算法
圖的最小生成樹與最短路徑的演算法
一、圖的生成樹與最小生成樹
在一個連通圖G中,如果取它的全部頂點和一部分邊構成一個子圖G』,即:
若邊集E(G』)中的邊既將圖中的所有頂點連通又不形成迴路,則稱子圖G』是原圖G的一棵生成樹。
最小生成樹:給圖中每個邊賦一權值,所有生成樹中所選擇邊的權值之和最小的生成樹,稱之為最小代價生成樹,即是最小生成樹。
1、普里姆演算法
1.1演算法描述
假設G=(V, E)是一個具有n個頂點的連通網,T=(U, TE)是G的最小生成樹,其中U是T的頂點集,TE是T的邊集,U和TE的初值均為空集。演算法開始時,首先從V中任取一個頂點(假定取v1),將它並入U中,此時U={v1},然後只要U是V的真子集(即),就從那些其一個端點已在T中,另一個端點仍在T外的所有邊中,找一條最短(即權值最小)邊,假定為(vi, vj),其中,並把該邊(vi, vj)和頂點vj分別並入T的邊集TE和頂點集U,如此進行下去,每次往生成樹里並入一個頂點和一條邊,直到(n-1)次後就把所有n個頂點都並入到生成樹T的頂點集中,此時U=V,TE中含有(n-1)條邊,T就是最後得到的最小生成樹。 1.2關鍵問題
普里姆演算法的關鍵之處是:每次如何從生成樹T中到T外的所有邊中,找出一條最短邊。例如,在第k次前,生成樹T中已有k個頂點和(k-1)條邊,此時T中到T外的所有邊數為k(n-k),當然它包括兩頂點間沒有直接邊相連,其權值被看作為「無窮大」的邊在內,從如此多的邊中查找最短邊,其時間復雜性為O(k(n-k)),顯然是很費時的。是否有一種好的方法能夠降低查找最短邊的時間復雜性呢? 1.3 解決方法
方法是:假定在進行第k次前已經保留著從T中到T外每一頂點(共(n-k)個頂點)的各一條最短邊,進行第k次時,首先從這(n-k)條最短邊中,找出一條最最短的邊(它就是從T中到T外的所有邊中的最短邊),假設為(vi, vj),此步需進行(n-k)次比較;然後把邊(vi, vj)和頂點vj分別並入T中的邊集TE和頂點集U中,此時T外只有n-(k+1)個頂點,對於其中的每個頂點vt,若(vj, vt)邊上的權值小於已保留的從原T中到vt的最短邊的權值,則用(v, vt)修改之,使從T中到T外頂點vt的最短邊為(vj, vt),否則原有最短邊保持不變,這樣,就把第k次後從T中到T外每一頂點vt的各一條最短邊都保留下來了。為進行第(k+1)次運算做好了准備,此步需進行(n-k-1)次比較。所以,利用此方法求第k次的最短邊共需比較2(n-k)-1次,即時間復雜性為O(n-k)。
1.4 prim演算法:
設一個輔助數組closedge,以記錄從U到V—U具有最小代價的邊。數組中的每個元素closedge[v]是記錄類型,包含兩個域: closedge[v].lowcast=Min{cost(u,v)|u∈U}; closedge[v].vex存儲該邊依附的在U中的頂點。
proc mintree_prim(gn:adjmatrix;u0:integer);
begin
for v:=1 to n do
if v<>u0 then
with closedage[v] do [vex:=u0; lowcast:=gn[u0,v];]
closedge[u0].lowcast:=0;{並入U集合}
for i:=1 to n-1 do
begin
v:=min(closedge);{尋找代價最小的邊}
write(closedge[v].vex,v); closedge[v].lowcast:=0;{並入U集合}
for k:=1 to n do
if gn[v,k]<closedge[k].lowcast then
begin closedge[k].lowcast:=gn[v,k]; closedge[k].vex:=v; end;
end;
end; 練習1:prim演算法實現
【問題描述】從文件中讀入連通帶權圖的信息,按prim演算法求出該圖的最小生成樹,以V1作為初始結點。
【輸入文件】第一行兩個整數m和n,分別表示圖的結點數和圖中的邊數。以下n行表示n條邊:每一行三個數x、y和k,k表示x與y之間邊的權值。
【輸出文件】共m行,第一行:最小生成樹的權;以下m-1行表示選取的邊,邊的第1個結點小於第2個結點,並按結點由小到大輸出。
【示例】輸入:5 7 輸出:45
1 2 17 1 4
2 3 30 1 5
1 4 5 2 4
2 4 10 3 5
3 4 24
3 5 7
1 5 23
練習2: Eddy painting
Eddy begins to like painting pictures recently ,he is sure of himself to become a painter.Every day Eddy draws pictures in his small room, and he usually puts out his newest pictures to let his friends appreciate. but the result it can be imagined, the friends are not interested in his picture.Eddy feels very puzze,in order to change all friends 's view to his technical of painting pictures ,so Eddy creates a problem for the his friends of you.
Problem descriptions as follows: Given you some coordinates pionts on a drawing paper, every point links with the ink with the straight line, causes all points finally to link in the same place. How many distants does your ty discover the shortest length which the ink draws?
Input:
The first line contains 0 < n <= 100, the number of point. For each point, a line follows; each following line contains two real numbers indicating the (x,y) coordinates of the point.
Input contains multiple test cases. Process to the end of file.
Output:
Your program prints a single real number to two decimal places: the minimum total length of ink lines that can connect all the points.
Sample Input:
3
1.0 1.0
2.0 2.0
2.0 4.0
Sample Output:
3.41
2、克魯斯卡爾演算法
2.1 演算法描述
假設G=(V,E)是一個具有n個頂點的連通網,T=(U,TE)是G的最小生成樹,U的初值等於V,即包含有G中的全部頂點,TE的初值為空。此演算法的基本思想是,將圖G中的邊按權值從小到大的順序依次選取,若選取的邊使生成樹T不形成迴路,則把它並入TE中,保留作為T的一條邊,若選取的邊使生成樹T形成迴路,則將其舍棄,如此進行下去,直到TE中包含有n-1條邊為止。此時的T即為最小生成樹。
2.2 關鍵問題
克魯斯卡爾演算法的關鍵之處是:如何判斷欲加入的一條邊是否與生成樹中已選取的邊形成迴路。這可將各頂點劃分為所屬集合的方法來解決,每個集合中的頂點表示一個無迴路的連通分量。演算法開始時,由於生成樹的頂點集等於圖G的頂點集,邊集為空,所以n個頂點分屬於n個集合。每個集合中只有一個頂點,表明頂點之問互不連通。
2.3 Kruskal演算法:
proc mintree_krusk(gn:adjmatrix);
begin
for i:=1 to n do
un[i]:=i;
for i:=1 to n-1 do
begin
minedge(a,b);
write(a,b,gn[a,b]);
k:=un[b];
for i:=1 to n do {兩個連通分量合並}
if un[i]=k then un[i]:=un[a];
end;
end;
2.4 注意:
proc minedge(var a:integer;var b:integer);用於在剩下的邊中選取不再同一連通分量上的最小代價的邊,邊的結點分別為a和b。
為了實現該過程,可以將圖中的邊生成一邊結點(包含兩個頂點和代價)數組,由小到大排序,然後通過排序後的數組進行處理;
un數組:用來記載隨著邊的加入,各頂點屬於哪個連通分量。
練習3:Kruskal演算法實現
【問題描述】從文件中讀入連通帶權圖的信息,按Kruskal演算法求出該圖的最小生成樹,以V1作為初始結點。
【輸入文件】第一行兩個整數m和n,分別表示圖的結點數和圖中的邊數。以下n行表示n條邊:每一行三個數x、y和k,k表示x與y之間邊的權值。
【輸出文件】共m行,第一行:最小生成樹的權;以下m-1行表示選取的邊,按選取邊的權值由小到大輸出。
【示例】輸入:5 7 輸出:45
1 2 17 1 4
2 3 30 3 5
1 4 5 2 4
2 4 10 1 5
3 4 24
3 5 7
1 5 23
練習4:判斷最小生成樹是否唯一
Given a connected undirected graph, tell if its minimum spanning tree is unique.
Definition 1 (Spanning Tree): Consider a connected, undirected graph G = (V, E). A spanning tree of G is a subgraph of G, say T = (V', E'), with the following properties:
1. V' = V.
2. T is connected and acyclic.
Definition 2 (Minimum Spanning Tree): Consider an edge-weighted, connected, undirected graph G = (V, E). The minimum spanning tree T = (V, E') of G is the spanning tree that has the smallest total cost. The total cost of T means the sum of the weights on all the edges in E'.
Input
The first line contains a single integer t (1 <= t <= 20), the number of test cases. Each case represents a graph. It begins with a line containing two integers n and m (1 <= n <= 100), the number of nodes and edges. Each of the following m lines contains a triple (xi, yi, wi), indicating that xi and yi are connected by an edge with weight = wi. For any two nodes, there is at most one edge connecting them.
Output
For each input, if the MST is unique, print the total cost of it, or otherwise print the string 'Not Unique!'.
Sample Input
2
3 3
1 2 1
2 3 2
3 1 3
4 4
1 2 2
2 3 2
3 4 2
4 1 2
Sample Output
3
Not Unique!
二、最短路徑
【問題描述】由於從一頂點到另一頂點可能存在著多條路徑。每條路徑上所經過的邊數可能不同,即路徑長度不同,我們把路徑長度最短(即經過的邊數最少)的那條路徑叫做最短路徑,其路徑長度叫做最短路徑長度或最短距離。求圖中一頂點vi到其餘各頂點的最短路徑和最短距離比較容易,只要從該頂點vi,出發對圖進行一次廣度優先搜索遍歷,在遍歷時記下每個結點的層次即可。
若圖是帶權圖(假定權值非負)從源點vi到終點vj的每條路徑上的權(它等於該路徑上所經邊上的權值之和,稱為該路徑的帶權路徑長度)可能不同,我們把權值最小的那條路徑也稱做最短路徑,其權值也稱作最短路徑長度或最短距離。
實際上,這兩類最短路徑問題可合並為一類,這只要把第一類的每條邊的權都設為1就歸屬於第二類了,所以在以後的討論中,若不特別指明,均是指第二類的最短路徑問題。
求圖的最短路徑問題包括兩個子問題:一是求圖中一頂點到其餘各頂點的最短路徑,二是求圖中每對頂點之間的最短路徑。下面分別進行討論。
始點 終點 最短路徑 路徑長度
v0 v1 No path
v2 (v0,v2) 10
v3 (v0,v4,v3) 50
v4 (v0,v4) 30
v5 (v0,v4,v3,v5) 60
始點 終點 最短路徑 路徑長度
v1 V2 (v1,v2) 10
V3 (v1,v2,v3) 27
V4 (v1,v5,v4) 20
v5 (v1,v5) 7
1、從一頂點到其餘各頂點的最短路徑
1.1 描述
迪傑斯特拉(Dijkstra)於1959年提出了解決此問題的一般演算法,具體做法是按照從源點到其餘每一頂點的最短路徑長度的升序依次求出從源點到各頂點的最短路徑及長度,每次求出從源點vi到一個終點vj的最短路徑及長度後,都要以vj作為新考慮的中間點,用vi到vj的最短路徑和最短路徑長度對vi到其它尚未求出最短路徑的那些終點的當前路徑及長度作必要的修改,使之成為當前新的最短路徑和最短路徑長度,當進行n-2次後演算法結束。
1.2 Dijkstra演算法:
首先,引進一個輔助向量dist,dist[i]表示當前所找到的從始點V到每個終點Vi的最短路徑長度。其初態為:若<v,vi>存在,則dist[i]為其上的權值,否則為最大值(計算機能表示)。
演算法:(1)用鄰接矩陣cost表示帶權有向圖。S表示已找到的從v出發的最短路徑的終點的集合,初態為空。dist向量的初值為:dist[v,i]=cost[v,i];
(2)選擇vj,使得:dist[j]=Min{dist[i]|vi∈V-S};vj就是當前求得從v出發的最短路徑的終點。
S=S+{j};
(3)修改從v出發到集合V-S上任意頂點vk可達的最短路徑長度。
if dist[j]+cost[j,k]<dist[k] then dist[k]:=dist[j]+cost[j,k];
(4)重復(2)(3)共n-1次。
代碼:proc short_dij;
begin
for i:=1 to n do
begin
dist[i]:=cost[v0,i];
if dist[i]<max then path[i]:=v0 else path[i]:=-1; end;
flag[I]:=true;
for k:=1 to n-1 do
begin
wm:=max; j:=v0;
for i:=1 to n do
if not(flag[i]) and (dist[i]<wm) then begin j:=i; m:=dist[i]; end;
flag[j]:=true; for i:=1 to n do if not(flag[i]) and (dist[j]+cost[j,i]<dist[i]) then
begin dist[i]:=dist[j]+cost[j,i]; path[i]:=j; end;
end;
end; 其中:cost:鄰接矩陣;
path[i]:存儲從v0到頂點i的最短路徑;是以集合作為數組元素;
dist[i]:存儲相應路徑長度;
flag[i]:表示已處理的頂點。
練習5:Dijkstra演算法練習
【問題描述】從文件中讀入帶權圖的信息,按Dijkstra演算法根據給定源點求出從源點法到該圖中其餘頂點的最短路徑。
【輸入文件】第一行:一個整數L:L=0表示無向圖,L=1表示有向圖;第二行三個整數m、n和k,分別表示圖的結點數、圖中的邊數以及源點。以下n行表示n條邊:每一行三個數x、y和z,z表示x與y之間邊的權值。
【輸出文件】共m-1行,每一行的數據包括:頂點: 最短路徑:路徑,如果不存在路徑,數據為:頂點:No path。
【示例】輸入:1 輸出:2:No path
6 8 1 3:10:1 3
1 3 10 4:50:1 5 4
1 5 30 5:30:1 5
1 6 100 6:60:1 5 4 6
2 3 5
3 4 50
4 6 10
5 4 20
5 6 60
練習6:路由選擇問題
【問題描述】
X城有一個含有N個節點的通信網路,在通信中,我們往往關心信息從一個節點I傳輸到節點J的最短路徑。遺憾的是,由於種種原因,線路中總有一些節點會出故障,因此在傳輸中要避開故障節點。
任務一:在己知故障節點的情況下,求避開這些故障節點,從節點I到節點J的最短路徑S0。
任務二:在不考慮故障節點的情況下,求從節點I到節點J的最短路徑S1、第二最短路徑S2。
【輸入文件】
第1行: N I J (節點個數 起始節點 目標節點)
第2—N+1行: Sk1 Sk2…SkN (節點K到節點J的距離為SkJ K=1,2,……,N)
最後一行: P T1 T2……Tp (故障節點的個數及編號)
【輸出文件】
S0 S1 S2 (S1<=S2 從節點I到節點J至少有兩條不同路徑)
【輸入輸出樣例】
route.in
5 1 5
0 10 5 0 0
10 0 0 6 20
5 0 0 30 35
0 6 30 0 6
0 20 35 6 0
1 2
route.out
40 22 30
2、每對頂點之間的最短路徑
求圖中每對頂點之間的最短路徑是指把圖中任意兩個頂點vi和vj(i≠j)之間的最短路徑都計算出來。解決此問題有兩種方法:一是分別以圖中的每個頂點為源點共調用n次迪傑斯特拉演算法,此方法的時間復雜性為O(n3);二是採用下面介紹的弗洛伊德(Floyed)演算法,此演算法的時間復雜性仍為O(n3),但比較簡單。 弗洛伊德演算法實際上是一個動態規劃的演算法。從圖的鄰接矩陣開始,按照頂點v1,v2,…,vn的次序,分別以每個頂點vk(1≤k≤n)作為新考慮的中間點,在第k-1次運算Ak-1 (A(0)為原圖的鄰接矩陣G) 的基礎上,求出每對頂點vi到vj的最短路徑長度計算公式為:
Floyd演算法:
proc shortpath_floyd;
begin
for i:=1 to n do for j:=1 to n do
begin
length[i,j]:=cost[i,j];
if length[i,j]<max then path[i,j]:=[i]+[j];
end;
for k:=1 to n do for i:=1 to n do for j:=1 to n do
if length[i,k]+length[k,j]<length[i,j] then
begin
length[i,j]:=length[i,k]+length[k,j];
path[i,j]:=path[i,k]+path[k,j];
end;
end;
其中:cost為鄰接矩陣;
path[i,j]:表示頂點i到j的最短路徑;
length[i,j]:
練習7:Floyd演算法練習
【問題描述】從文件中讀入帶權圖的信息,按Dijkstra演算法根據給定源點求出從源點到該圖中其餘頂點的最短路徑。
【輸入文件】第一行:一個整數L:L=0表示無向圖,L=1表示有向圖;第二行三個整數m、n,分別表示圖的結點數和圖中的邊數。以下n行表示n條邊:每一行三個數x、y和z,z表示x與y之間邊的權值。第n+2行:整數R,以下R行每行一個整數表示頂點標號作為源點。
【輸出文件】共R行,每一行的數據表示源點到其餘頂點的距離,按頂點編號由小大輸出,如果沒有路徑,輸出-1。
【示例】輸入:1 輸出:-1 10 50 30 60
6 8 -1 –1 –1 20 30
1 3 10
1 5 30
1 6 100
2 3 5
3 4 50
4 6 10
5 4 20
5 6 60
2
1
5