程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 六講貫通C++圖的應用之三 無向圖(1)

六講貫通C++圖的應用之三 無向圖(1)

編輯:C++入門知識

筆者從基本儲存方法DFS和BFS無向圖最小生成樹最短路徑以及活動網絡(AOV、AOE)六個方面詳細介紹C++圖的應用。之前我們已經介紹了基本存儲方法、DFS和BFS,這篇我們繼續介紹無向圖

無向圖

要是在紙上隨便畫畫,或者只是對圖做點示范性的說明,大多數人都會選擇無向圖。然而在計算機中,無向圖卻是按照有向圖的方法來儲存的——存兩條有向邊。實際上,當我們說到無向的時候,只是忽略方向——在紙上畫一條線,難不成那線“嗖”的就出現了,不是從一頭到另一頭畫出來的? 無向圖有幾個特有的概念,連通分量、關節點、最小生成樹。下面將分別介紹,在此之前,先完成無向圖類的基本操作。

無向圖類

  1. template <class name, class dist, class mem>  
  2. class Graph : public Network  
  3. {  
  4. public:  
  5. Graph() {}  
  6. Graph(dist maxdist) : Network (maxdist) {}  
  7. bool insertE(name v1, name v2, dist cost)  
  8. {  
  9. if (Network::insertE(v1, v2, cost))  
  10. return Network::insertE(v2, v1, cost);  
  11. return false;  
  12. }  
  13. }; 

僅僅是添加邊的時候,再添加一條反向邊,很簡單。

連通分量

這是無向圖特有的,有向圖可要復雜多了(強、單、弱連通),原因就是無向圖的邊怎麼走都行,有向圖的邊好像掉下無底深淵就再也爬不上來了。有了DFS,求連通分量的算法就變得非常簡單了——對每個沒有訪問的頂點調用DFS就可以了。

  1. void components()  
  2. {  
  3. visited = new bool[vNum()]; int i, j = 0;  
  4. for (i = 0; i < vNum(); i++) visited[i] = false;  
  5. cout << "Components:" << endl;  
  6. for (i = 0; i < vNum(); i++)  
  7. {  
  8. if (!visited[i]) { cout << '(' << ++j << ')'; DFS(i); cout << endl; }  
  9. }  
  10. delete []visited;  


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved