精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

六講貫通C++圖的應用之四 最小生成樹

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

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

  最小生成樹

  說人是最難伺候的,真是一點不假。上面剛剛為了“提高可靠性”添加了幾條多余的邊,這會兒又來想辦法怎么能以最小的代價把所有的頂點都連起來??赡苷侨说倪@種精神才使得人類能夠進步吧——看著現在3GHz的CPU真是眼紅啊,我還在受500MHz的煎熬,然后再想想8086……

  正如圖的基本元素是頂點和邊,從這兩個方向出發,就能得到兩個算法——Kruskal算法(從邊出發)、Prim算法(從頂點出發)。據說還有別的方法,恕我參考資料有限,不能詳查。

  最小生成樹的儲存

  顯然用常用的樹的儲存方法來儲存沒有必要,雖然名曰“樹”,實際上,這里誰是誰的“祖先”、“子孫”并不重要。因此,用如下的MSTedge結構數組來儲存就可以了。

  1. template <class dist>   
  2. class MSTedge   
  3. {   
  4. public:   
  5. MSTedge() {}   
  6. MSTedge(int v1, int v2, dist cost) : v1(v1), v2(v2), cost(cost) {}   
  7. int v1, v2;   
  8. dist cost;   
  9. bool operator > (const MSTedge& v2) { return (cost > v2.cost); }   
  10. bool operator < (const MSTedge& v2) { return (cost < v2.cost); }   
  11. bool operator == (const MSTedge& v2) { return (cost == v2.cost); }   
  12. };  

  Kruskal算法

  最小生成樹直白的講就是,挑選N-1條不產生回路最短的邊。Kruskal算法算是最直接的表達了這個思想——在剩余邊中挑選一條最短的邊,看是否產生回路,是放棄,不是選定然后重復這個步驟。說起來倒是很簡單,做起來就不那么容易了——判斷是否產生回路需要并查集,在剩余邊中找一條最短的邊需要最小堆(并不需要對所有邊排序,所以堆是最佳選擇)。

  Kruskal算法的復雜度是O(eloge),當e接近N^2時,可以看到這個算法不如O(N^2)的Prim算法,因此,他適合于稀疏圖。而作為稀疏圖,通常用鄰接表來儲存比較好。另外,對于鄰接矩陣儲存的圖,Kruskal算法比Prim算法占不到什么便宜(初始還要掃描N^2條“邊”)。因此,最好把Kruskal算法放在Link類里面。

  1. template <class name, class dist> int Link::MinSpanTree(MSTedge* a)   
  2. {   
  3. MinHeap > E; int i, j, k, l = 0;   
  4. MFSets V(vNum); list::iterator iter;   
  5. for (i = 0; i < vNum; i++)   
  6. for (iter = vertices[i].e->begin(); iter != vertices[i].e->end(); iter++)   
  7. E.insert(MSTedge(i, iter->vID, iter->cost));//建立邊的堆   
  8. for (i = 0; i < eNum && l < vNum; i++)//Kruskal Start   
  9. {   
  10. j = V.find(E.top().v1); k = V.find(E.top().v2);   
  11. if (j != k) { V.merge(j, k); a[l] = E.top(); l++; }   
  12. E.pop();   
  13. }   
  14. return l;   
  15. }  

  下面是堆和并查集的實現

  1. #ifndef Heap_H   
  2. #define Heap_H   
  3. #include    
  4. using namespace std;   
  5. #define minchild(i) (heap[i*2+1] 
  6. template <class T>   
  7. class MinHeap   
  8. {   
  9. public:   
  10. void insert(const T& x) { heap.push_back(x); FilterUp(heap.size()-1); }   
  11. const T& top() { return heap[0]; }   
  12. void pop() { heap[0] = heap.back(); heap.pop_back(); FilterDown(0); }   
  13. private:   
  14. void FilterUp(int i)   
  15. {   
  16. for (int j = (i - 1) / 2; j >= 0 && heap[j] > heap[i]; i = j, j = (i - 1) / 2)   
  17. swap(heap[i], heap[j]);   
  18. }   
  19. void FilterDown(int i)   
  20. {   
  21. for (int j = minchild(i); j < heap.size() && heap[j] < heap[i]; i = j, j = minchild(i))   
  22. swap(heap[i], heap[j]);   
  23. }   
  24. vector heap;   
  25. };   
  26. #endif   
  27.  
  28. #ifndef MFSets_H   
  29. #define MFSets_H   
  30. class MFSets   
  31. {   
  32. public:   
  33. MFSets(int maxsize) : size(maxsize)   
  34. {   
  35. parent = new int[size + 1];   
  36. for (int i = 0; i <= size; i++) parent[i] = -1;   
  37. }   
  38. ~MFSets() { delete []parent; }   
  39. void merge(int root1, int root2)//root1!=root2   
  40. {   
  41. parent[root2] = root1;   
  42. }   
  43. int find(int n)   
  44. {   
  45. if (parent[n] < 0) return n;   
  46. return find(parent[n]);   
  47. }   
  48. private:   
  49. int size;   
  50. int* parent;   
  51. };   
  52. #endif  

#p#

  Prim算法

  如果從頂點入手,就能得到另一種方法。從只含有一個頂點的集合開始,尋找集合外面的頂點到這個集合里的頂點最近的一條邊,然后將這個頂點加入集合,修改因為這個頂點的加入而使得集合外面的頂點到集合里的頂點的最短距離產生變化的分量。因為需要對每個頂點掃描,鄰接矩陣儲存的圖是最合適Prim算法的。

  1. template <class name, class dist> int AdjMatrix::MinSpanTree(MSTedge* a)   
  2. {   
  3. dist* lowC = new dist[vNum]; int* nearV = new int[vNum];   
  4. int i, j, k;   
  5. for (i = 0; i < vNum; i++) { lowC[i] = edge[0][i]; nearV[i] = 0; } nearV[0] = -1;   
  6. for (k = 0; k < vNum-1; k++)//Prim Start   
  7. {   
  8. for (i = 1, j = 0; i < vNum; i++)   
  9. if (nearV[i] != -1 && lowC[i] < lowC[j]) j = i;//find low cost   
  10. a[k] = MSTedge(nearV[j], j, lowC[j]); nearV[j] = -1; //insert MST   
  11. if (a[k].cost == NoEdge) return k - 1;//no edge then return   
  12. for (i = 1; i < vNum; i++)//modify low cost   
  13. if (nearV[i] != -1 && edge[i][j] < lowC[i]) { lowC[i] = edge[i][j]; nearV[i] = j; }   
  14. }   
  15. return k;   
  16. }  

  【附注】這里需要說明一下,對于edge[I][I]這樣的是應該是0呢還是NoEdge呢?顯然0合理,但是不好用。并且,從有權圖無權圖統一的角度來說,是NoEdge更好。因此,在我的有權圖的鄰接矩陣中,主對角線上的元素是NoEdge,而不是書上的0。

  測試程序

  儲存和操作分離,沒想到得到了一個有趣的結果——對于最后的無向圖而言,最小生成樹的算法對外表現不知道是采用了那個算法。

  1. template <class name, class dist, class mem>   
  2. bool Graph::MinSpanTree()   
  3. {   
  4. MSTedge* a = new MSTedge[vNum() - 1];   
  5. int n = data.MinSpanTree(a); dist sum = dist();   
  6. if (n < vNum() - 1) return false;//不夠N-1條邊,不是生成樹   
  7. for (int i = 0; i < n; i++)   
  8. {   
  9. cout << '(' << getV(a[i].v1) << ',' << getV(a[i].v2) << ')' << a[i].cost << ' ';   
  10. sum += a[i].cost;   
  11. }   
  12. cout << endl << "MinCost: " << sum << endl;   
  13. delete []a;   
  14. return true;   
  15. }  

  最后的測試圖的數據取自《數據結構算法與應用-C++語言描述》(中文譯名)

  1. #include    
  2. using namespace std;   
  3. #include "Graph.h"   
  4. int main()   
  5. {   
  6. Graph<charint, AdjMatrix<charint> > a(100);//改為Link儲存為Kruskal算法   
  7. a.insertV('A'); a.insertV('B');   
  8. a.insertV('C'); a.insertV('D');   
  9. a.insertV('E'); a.insertV('F');   
  10. a.insertV('G');   
  11. a.insertE('A''B', 28); a.insertE('A''F', 10);   
  12. a.insertE('B''C', 16); a.insertE('C''D', 12);   
  13. a.insertE('D''E', 22); a.insertE('B''G', 14);   
  14. a.insertE('E''F', 25); a.insertE('D''G', 18);   
  15. a.insertE('E''G', 24);   
  16. a.MinSpanTree();   
  17. return 0;   
  18. }  

【編輯推薦】

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

2011-04-11 16:43:51

AOVAOE活動網絡

2011-04-11 16:10:55

無向圖C++

2011-04-11 16:32:28

路徑C++

2011-04-11 15:57:22

DFSBFSC++

2011-04-11 15:53:40

C++

2011-04-11 14:52:18

選擇排序排序C++

2023-11-27 15:01:21

Prim算法Kruskal算法

2011-04-11 14:21:43

希爾排序排序C++

2011-04-11 13:41:34

插入排序排序C++

2011-04-11 14:29:44

交換排序冒泡排序排序

2019-09-09 14:33:17

開發者技能算法

2021-09-29 18:28:41

數據結構算法最小生成樹

2010-07-06 15:46:41

UDP協議

2010-01-14 09:27:44

C++語言

2011-03-30 17:20:18

C++引用

2010-01-20 11:02:42

C++開發環境

2024-01-23 12:54:00

C++編程語言代碼

2010-02-03 15:27:26

C++ static

2021-02-20 06:13:18

C 語言C++

2013-12-21 20:03:34

SDN應用應用交付SDN
點贊
收藏

51CTO技術棧公眾號

人人妻人人澡人人爽久久av| 久久综合激情网| 国产成人77亚洲精品www| 国产精品二三区| 成人91视频| 国产成人亚洲欧洲在线| av亚洲在线观看| 欧美精品 日韩| www插插插无码免费视频网站| 男人的天堂a在线| 久久激情视频| 久久精品国产2020观看福利| 97精品人人妻人人| 日韩av免费| 久久久精品tv| 成人网页在线免费观看| 曰本女人与公拘交酡| 91蜜桃臀久久一区二区| 欧美日韩美女在线| 日韩精品成人一区二区在线观看| 国产又粗又猛又黄又爽| 亚洲承认在线| 一区二区三区视频在线| 国产在线视频三区| 黄色影院在线看| 久久亚洲一级片| 国产精品久久久久久久久久99| 黄大色黄女片18免费| 97人人澡人人爽91综合色| 色偷偷久久人人79超碰人人澡| 在线观看国产一区| 亚洲av色香蕉一区二区三区| 亚洲综合不卡| 久久精品国产成人| 北京富婆泄欲对白| 四虎影视4hu4虎成人| 亚洲色图清纯唯美| 欧美在线3区| 性一交一乱一透一a级| 欧美中文日韩| 欧美精品在线第一页| av直播在线观看| 国产95亚洲| 色综合天天综合| 少妇一晚三次一区二区三区| 丁香在线视频| 99国产精品国产精品久久| 91九色国产社区在线观看| 97久久久久久久| 欧美日韩蜜桃| 成人444kkkk在线观看| 亚洲精品午夜视频| 蜜桃视频欧美| 亚洲精品国产精品乱码不99按摩 | 日本亚洲欧洲色α| 青春草免费视频| 日韩在线高清| 一区二区国产精品视频| 三上悠亚影音先锋| 日韩三区视频| 日韩精品免费在线播放| 人妻互换一二三区激情视频| 欧美一区一区| 日韩欧美国产麻豆| 手机在线国产视频| 免费成人黄色网| 欧美日韩国产成人在线91| 日韩中文字幕组| xx欧美视频| 欧美日韩亚洲一区二| 欧美啪啪免费视频| 91吃瓜在线观看| 五月激情丁香一区二区三区| 老子影院午夜伦不卡大全| 在线你懂的视频| 亚洲猫色日本管| 久久av秘一区二区三区| 日本视频在线观看| 中文字幕一区在线观看视频| 一区二区三区三区在线| 免费超碰在线| 亚洲欧美乱综合| av动漫在线播放| 手机在线免费看av| 香蕉加勒比综合久久| 国产午夜大地久久| 日韩成人亚洲| 欧美日本韩国一区二区三区视频 | 国产精品一区二区免费不卡| 91香蕉视频在线下载| 亚洲经典一区二区三区| 波多野结衣91| 欧美一级日本a级v片| 免费a级毛片在线播放| 一区二区三区精品视频在线| 97中文字幕在线| 电影一区二区三| 欧美日韩中文字幕精品| 亚洲精品在线网址| 精品自拍偷拍| 国产亚洲欧美另类中文| 国产男女猛烈无遮挡在线喷水| 欧美国产91| 777精品视频| 中文字幕+乱码+中文| 久久国内精品视频| 91麻豆精品秘密入口| 国产成人麻豆精品午夜在线| 久久综合九色综合欧美98| 午夜精品一区二区在线观看的| gogo在线观看| 日韩欧美黄色动漫| 在线视频观看91| 亚洲大片精品免费| 久热在线中文字幕色999舞| 欧美日韩综合在线观看| 久久99久久精品| 国产欧美在线一区二区| 一级毛片视频在线| 亚洲国产毛片aaaaa无费看| 国产极品美女高潮无套久久久| 超碰国产精品一区二页| 亚洲精品视频免费| 成人性生活毛片| 日韩激情在线观看| 国产精品国产精品国产专区不卡| 成年人视频在线观看免费| 一区二区在线观看免费视频播放| 国产综合免费视频| 538任你躁精品视频网免费| 在线成人激情视频| 中文字幕亚洲精品在线| 国产成人午夜电影网| 日韩精品一线二线三线| f2c人成在线观看免费视频| 欧美猛男gaygay网站| 亚洲一区二区观看| 亚洲无吗在线| 91色视频在线导航| 国产youjizz在线| 午夜成人在线视频| 丰满少妇一区二区三区专区| 成人在线亚洲| 日本一区二区三区在线播放| 免费国产精品视频| 亚洲精品免费一二三区| 亚洲免费看av| 成人免费av| 日韩美女免费线视频| 无码精品视频一区二区三区 | 99久久精品免费看国产一区二区三区 | 日本电影在线观看网站| 午夜久久久久久久久| 国产原创精品在线| 欧美日一区二区| 国产aⅴ夜夜欢一区二区三区 | 欧美爱爱小视频| 韩国v欧美v日本v亚洲v| 一区二区三区四区五区精品| 日韩不卡免费高清视频| 亚洲精品久久久久久久久久久久| 久久免费精彩视频| 国产高清亚洲一区| 亚洲小视频在线播放| 97精品资源在线观看| 久久久精品999| 夜夜躁狠狠躁日日躁av| 国产精品人人做人人爽人人添| 人人爽人人av| 久久中文字幕二区| 91久久国产综合久久91精品网站| 香蕉视频在线播放| 91精品国产入口在线| 少妇被躁爽到高潮无码文| 国产一区二区精品久久| 久久亚洲a v| 国产精品丝袜在线播放| 午夜精品理论片| 午夜在线视频免费| 欧美日韩国产一区中文午夜| 丰满少妇一区二区三区| 久久精选视频| 神马影院午夜我不卡| 亚洲国产伊人| 欧美日韩国产第一页| 亚洲精品视频91| 欧美日韩美女在线| 欧美熟妇激情一区二区三区| 久久99精品久久只有精品| 香蕉视频免费版| 女同另类激情重口| 91av视频在线观看| 久久精品蜜桃| 欧美精品777| 91精品国产高清一区二区三蜜臀| 国产精品综合久久| 国产精品免费看久久久无码| 久久99久久人婷婷精品综合 | 亚洲天堂av资源在线观看| 久久视频这里只有精品| 天天操天天干天天爱| 色视频一区二区| 97精品在线播放| 成人丝袜高跟foot| 能看的毛片网站| 婷婷久久国产对白刺激五月99| 福利视频久久| 亚洲精品国产嫩草在线观看| 欧美另类精品xxxx孕妇| 亚洲av片在线观看| 在线精品亚洲一区二区不卡| 91麻豆精品成人一区二区| 粉嫩欧美一区二区三区高清影视 | 成人bbav| 色视频www在线播放国产成人| 蜜臀av中文字幕| 欧洲视频一区二区| 亚洲精品午夜久久久久久久| 亚洲国产精品t66y| 免费不卡的av| 日韩精品三区四区| 91九色丨porny丨国产jk| 99精品国产一区二区三区| 久久一区免费| 视频精品一区| 国产精品爽黄69| 中文在线8资源库| 欧美大秀在线观看| 午夜激情在线观看| 亚洲精品自在久久| 精品人妻aV中文字幕乱码色欲| 色狠狠综合天天综合综合| 精品在线视频免费| 中文字幕一区二区三区乱码在线 | 欧美乱做爰xxxⅹ久久久| 成人在线国产| 欧美污视频久久久| 精品视频自拍| 国产精品免费在线播放| 主播大秀视频在线观看一区二区| 国内精品久久久久久影视8| 黄色网在线免费观看| 最新91在线视频| 国产乱视频在线观看| 国产视频精品在线| 国产香蕉在线观看| 欧美va亚洲va国产综合| 国产视频手机在线| 欧美日韩高清一区二区不卡| 极品国产91在线网站| 黄色91在线观看| 日本亚洲色大成网站www久久| 亚洲乱码一区二区三区在线观看| 蜜桃视频最新网址| 中文字幕亚洲综合久久菠萝蜜| 女人又爽又黄免费女仆| 久久久噜噜噜久噜久久综合| 亚洲一区二区三区综合| 成人av电影在线| 亚洲欧美日韩偷拍| www.欧美.com| 大尺度在线观看| 26uuu精品一区二区在线观看| 国产白嫩美女无套久久| 不卡av免费在线观看| 亚洲欧美日韩偷拍| 久久中文娱乐网| 亚洲人成人无码网www国产| 久久久久88色偷偷免费| 成人片黄网站色大片免费毛片| 国产情人综合久久777777| 在线视频第一页| 国产精品久久久久9999吃药| 五月天免费网站| 亚洲欧美日韩国产另类专区 | 国产精品suv一区二区69| 亚洲第一主播视频| 国产成人在线免费观看视频| 欧美性猛交xxxx乱大交3| 无码人妻丰满熟妇精品| 欧美日韩亚洲综合一区二区三区| 亚洲天堂免费av| 日韩一区二区三区在线| 国产精品欧美久久久久天天影视| 日韩欧美中文字幕公布| 黄色aaa毛片| 亚洲性生活视频| 黄色成人在线| 欧美国产激情18| 性孕妇free特大另类| 国产人妖伪娘一区91| 91精品国产经典在线观看| 亚洲在线观看视频网站| 国产成人精品福利| 欧美高清性xxxxhdvideosex| 日韩成人精品一区| 免费的一级黄色片| 三级在线观看一区二区| 午夜一区二区视频| av中文字幕亚洲| 夫妇交换中文字幕| 夜夜夜精品看看| 男人天堂视频在线| 日韩欧美在线一区二区三区| 日本中文字幕一区二区有码在线 | 91精品国产麻豆国产在线观看| 99久久久精品视频| 视频一区中文字幕| wwwww在线观看| 国产欧美视频一区二区| 日本免费网站视频| 婷婷久久综合九色综合绿巨人| 日本视频在线观看免费| 精品国内二区三区| 色资源在线观看| 不卡中文字幕av| 日韩不卡视频在线观看| 国产精品露出视频| 五月开心六月丁香综合色啪 | 成人无码av片在线观看| 亚洲妇熟xx妇色黄| 国产又黄又粗又长| 亚洲午夜未满十八勿入免费观看全集| av黄在线观看| 国产乱肥老妇国产一区二| 亚洲精品**不卡在线播he| 成人区一区二区| 久久se这里有精品| 精品无码一区二区三区| 亚洲国产成人tv| 国产理论视频在线观看| 有码中文亚洲精品| 麻豆国产在线| 亚洲va男人天堂| 国产精品欧美三级在线观看| 真实国产乱子伦对白视频| 蜜臀va亚洲va欧美va天堂| 中文字幕 欧美 日韩| 中文字幕亚洲综合久久菠萝蜜| 久久久蜜桃一区二区| 日韩国产高清污视频在线观看| 日本一级理论片在线大全| 成人久久久久爱| 欧美hd在线| 午夜免费福利在线| 久久久美女毛片| 亚洲午夜18毛片在线看| 亚洲黄页视频免费观看| 国产乱码在线| 亚洲专区国产精品| 欧美在线亚洲| 欧美色图校园春色| 亚洲视频香蕉人妖| 国产一区二区波多野结衣| 精品国内自产拍在线观看| 成人国产精品入口免费视频| 欧美一区二区三区四区夜夜大片| 国产精品美女久久久浪潮软件| 国产在线不卡av| 亚洲超碰97人人做人人爱| 999久久久久| 久久精品小视频| 亚洲日韩中文字幕一区| 麻豆视频传媒入口| 国产成人免费高清| 久久久久久久久久久网 | 久久久久免费视频| 高潮久久久久久久久久久久久久| 国产精品一线二线三线| 99久久伊人久久99| www.毛片.com| 中文在线资源观看视频网站免费不卡| 69堂精品视频在线播放| 亚洲国产综合自拍| 久久在线精品| 欧美h片在线观看| 精品国产污污免费网站入口 | 欧美夫妻性生活xx| 精品久久ai| 成人在线观看a| 中文字幕在线一区二区三区| 国产丰满果冻videossex| 午夜精品久久久久久久男人的天堂 | 国产精品久久久久久久久晋中 | 国产主播喷水一区二区| 欧美fxxxxxx另类| 美国黄色一级视频| 狠狠躁夜夜躁人人躁婷婷91| 亚洲乱亚洲乱妇| 不卡一卡2卡3卡4卡精品在| 亚洲一区二区三区免费在线观看| 国产综合精品在线| 91精品欧美福利在线观看| 欧美1—12sexvideos| 久久国产一区| 麻豆精品久久精品色综合| 久久成人在线观看| 亚洲老头老太hd| 99精品女人在线观看免费视频| 日本人体一区二区|