成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發 后端
圖的應用恐怕是C++所有數據結構中最寬泛的了,本次六講筆者從基本儲存方法、DFS和BFS、無向圖、最小生成樹、最短路徑以及活動網絡(AOV、AOE)六個方面詳細介紹圖的應用。本文是這次系列文章的第三篇,主要介紹無向圖。

  筆者從基本儲存方法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;  

#p#

  關節點

  下定義是人們認識事物的一個方法,因為概念使得人們能夠區分事物——關于這個還有個絕對的運動和相對的靜止的哲學觀點(河水總在流,但是長江還叫長江,記得那個著名的“不可能踏進同一條河里”嗎?)因此,能否有個準確的概念往往是一門學科發展程度的標志,而能否下一個準確的定義反映了一個人的思維能力。說這么多廢話,原因只有一個,我沒搞清楚什么叫“關節點”——參考書有限,不能仔細的考究了,如有誤解,還望指正。

  嚴版是這么說的:如果刪除某個頂點,將圖的一個連通分量分割成兩個或兩個以上的連通分量,稱該頂點為關節點。——雖然沒有提到圖必須是無向的,但是提到了連通分量已經默認是無向圖了。

  殷版是這么說的:在一個無向連通圖中,……(余下同嚴版)。

  問題出來了,非連通圖是否可以討論含有關節點?我們是否可以說某個連通分量中含有關節點?遺憾的是,嚴版留下這個問題之后,在后面給出的算法是按照連通圖給的,這樣當圖非連通時結果就是錯的。殷版更是滑頭,只輸出重連通分量,不輸出關節點,自己雖然假定圖是連通的,同樣沒有連通判斷。

  翻翻離散數學吧,結果沒找到什么“關節點”,只有“割點”,是這樣的:一個無向連通圖,如果刪除某個頂點后,變為非連通圖,該頂點稱為割點。權當“割點”就是“關節點”,那么算法至少也要先判斷是否連通吧?可是書上都直接當連通的了……

  關于算法不再細說,書上都有。下面的示例,能輸出每個連通分量的“關節點”(是不是可以這樣叫,我也不清楚)。dfn儲存的是每個頂點的訪問序號,low是深度優先生成樹上每個非葉子頂點的子女通過回邊所能到達的頂點最小的訪問序號。把指向雙親的邊也當成回邊并不影響判斷,因此不必特意區分,殷版顯式區分了,屬于畫蛇添足。這樣一來,if (low[n] >= dfn[i]) cout << getV(i);這個輸出關節點的判斷中的>=就顯得很尷尬了,因為只能等于不可能大于。還要注意的是,生成樹的根(DFS的起始點)是單獨判斷的。

  1. void articul()  
  2. {  
  3. dfn = new int[vNum()]; low = new int[vNum()]; int i, j = 0, n;  
  4. for(i = 0; i < vNum(); i++) dfn[i] = low[i] = 0;//初始化  
  5. for (i = 0; i < vNum(); i++)  
  6. {  
  7. if (!dfn[i])  
  8. {  
  9. cout << '(' << ++j << ')'; dfn[i] = low[i] = count = 1;  
  10. if ((n = nextV(i)) != -1) articul(n); bool out = false;//訪問樹根  
  11. while ((n = nextV(i, n)) != -1)  
  12. {  
  13. if (dfn[n]) continue;  
  14. if (!out) { cout << getV(i); out = true; }//樹根有不只一個子女  
  15. articul(n);//訪問其他子女  
  16. }  
  17. cout << endl;  
  18. }  
  19. }  
  20. delete []dfn; delete []low;  
  21. }  
  22.  
  23. private:  
  24. void articul(int i)  
  25. {  
  26. dfn[i] = low[i] = ++count;  
  27. for (int n = nextV(i); n != -1; n = nextV(i, n))  
  28. {  
  29. if (!dfn[n])  
  30. {  
  31. articul(n);  
  32. if (low[n] < low[i]) low[i] = low[n];  
  33. if (low[n] >= dfn[i]) cout << getV(i);//這里只可能=  
  34. }  
  35. else if (dfn[n] < low[i]) low[i] = dfn[n];//回邊判斷  
  36. }  
  37. }  
  38. int *dfn, *low, count; 

【編輯推薦】

  1. 經典四講貫通C++排序之一 插入排序
  2. c++編程常用工具
  3. 給C++初學者的50個忠告
  4. c++最基礎的20條規則
  5. 程序員必看 c++筆試題匯總
責任編輯:韓亞珊 來源: 天極網
相關推薦

2011-04-11 16:43:51

AOVAOE活動網絡

2011-04-11 16:32:28

路徑C++

2011-04-11 15:53:40

C++

2011-04-11 15:57:22

DFSBFSC++

2011-04-11 16:19:56

C++

2011-04-11 14:29:44

交換排序冒泡排序排序

2011-04-11 14:52:18

選擇排序排序C++

2011-04-11 14:21:43

希爾排序排序C++

2011-04-11 13:41:34

插入排序排序C++

2021-10-29 09:44:50

C++指針變量

2011-03-11 13:26:32

SQL ServerBlocking阻塞

2021-02-16 10:57:34

C++ C 語言windows

2021-04-19 09:08:19

無向圖數據結構

2011-07-10 14:23:58

投影儀用戶體驗

2024-05-30 07:41:22

2020-12-04 10:31:56

組消費分區Kafka

2010-01-14 09:27:44

C++語言

2011-08-15 10:15:00

iPhone開發警告框

2010-07-02 12:53:07

UML對象圖

2012-12-12 16:07:46

VMwareWorkstation
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: va精品 | 中文字幕一级毛片视频 | 日韩欧美国产精品一区 | 国产在线一级片 | 中文字幕亚洲专区 | 色啪网 | 日日骚视频 | 色就是色欧美 | 精品视频在线观看 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 在线视频a| 欧美电影免费观看 | 久久久人成影片一区二区三区 | 午夜精品久久久久久久久久久久久 | 狠狠操电影 | 国产美女视频黄a视频免费 国产精品福利视频 | 手机看黄av免费网址 | 亚洲自拍偷拍欧美 | 久久久无码精品亚洲日韩按摩 | 日韩中文一区 | 99国产视频 | 久久69精品久久久久久久电影好 | www.日韩av.com| 久久久国产精品一区 | 日韩欧美在线观看 | 日韩中文字幕免费在线 | 久久成人久久 | 日本高清在线一区 | 18av在线播放 | 黑人精品 | 久久久精品一区 | 天天射天天操天天干 | 日韩精品 电影一区 亚洲 | 精品少妇一区二区三区在线播放 | 精品国产一区二区三区成人影院 | 美女毛片免费看 | 日韩毛片在线视频 | 久久国产精品-久久精品 | 色一级| 日韩中文字幕在线视频 | 国产一区在线看 |