精品欧美一区二区三区在线观看 _久久久久国色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一区| 神马一区二区影院| 亚洲黄色小说网址| 日本欧美在线观看| 欧美激情久久久| 最近中文字幕在线mv视频在线 | 亚洲黄色录像片| 国产三区精品| 国产一区二区小视频| 夜夜嗨av一区二区三区网站四季av| 在线观看视频99| 国产日韩视频一区| av一级久久| 色域天天综合网| www.夜夜爱| 自拍视频在线播放| 久久麻豆一区二区| 99在线观看视频| 中文字幕久久久久| 国产一区二区三区久久| 久久精品视频一| 高潮毛片无遮挡| 超碰成人在线免费| 91精品视频网| 在线观看免费视频高清游戏推荐| 性欧美18xxxhd| 亚洲一区二区五区| ijzzijzzij亚洲大全| 都市激情在线视频| 久久精品亚洲精品国产欧美kt∨ | 亚洲免费成人av在线| 欧美一区日韩一区| 成 人 黄 色 小说网站 s色| 天堂av在线| 亚洲国产精品久久人人爱蜜臀| 在线国产99| 国产高清在线看| 久久免费电影网| 久久一区二区三区av| 免费观看的毛片| 国产99久久久久| 亚洲综合中文字幕68页| 国产在成人精品线拍偷自揄拍| 天堂午夜影视日韩欧美一区二区| 青青青国产精品一区二区| 日本一级黄色录像| 一区二区亚洲精品| 国内久久久精品| 日本三级视频在线| 日韩天天综合| 69av在线播放| 伊人中文字幕在线观看| 蜜桃视频一区| 国产精品白嫩初高中害羞小美女| 国产综合精品视频| 久久狠狠婷婷| 国产精品视频中文字幕91| 国产精品51麻豆cm传媒 | 午夜视频在线观看一区二区| 久久精品无码中文字幕| av影视在线看| 天天亚洲美女在线视频| 成人小视频在线看| 99久久综合国产精品二区| 欧美日韩久久久| 性欧美在线视频| 成人综合日日夜夜| 欧美成人女星排名| 国产福利短视频| 精品国产不卡| 久热爱精品视频线路一| 久久影院一区二区| 日韩一级大片| 国产精品h在线观看| 7777久久亚洲中文字幕| 国产成人在线观看免费网站| 国产精品美女黄网| 久久电影视频| 亚洲免费观看在线观看| 黄色一级片在线看| 欧美aaa大片视频一二区| 欧美高清精品3d| jjzz黄色片| 国产欧美日韩一区二区三区四区| 久热精品视频在线免费观看 | 麻豆传媒免费在线观看| 亚洲综合免费观看高清完整版在线| 成人在线观看你懂的| 欧美黑人疯狂性受xxxxx野外| 欧美日韩中文字幕一区| 亚洲免费观看在线| 成人看的羞羞网站| 久久久久久亚洲精品| 亚洲国产av一区二区三区| 狠狠色综合日日| 久久精品magnetxturnbtih| 日韩三级影院| 精品国产91久久久| 成人日韩在线视频| 欧美美女在线直播| 久久亚洲成人精品| www.com亚洲| 高清免费成人av| 亚洲国产一区二区在线| 高潮在线视频| 欧美一级免费大片| 国产18无套直看片| 欧美综合国产| 国产精品对白刺激久久久| 午夜激情视频在线| 色婷婷综合久久久中文一区二区| 亚洲熟女乱综合一区二区| 精品视频99| 91av在线播放视频| 亚洲第一成人av| 中文字幕中文字幕在线一区 | 日本一区免费网站| 亚洲精品动漫100p| 久草视频免费在线| 国产一区视频网站| 一本一本久久a久久精品综合妖精| 深夜福利视频一区二区| 精品少妇一区二区三区| www.av成人| 美女视频黄a大片欧美| 欧美午夜免费| 亚洲最大网站| 亚洲精品按摩视频| 久久精品欧美一区二区| 国产成人超碰人人澡人人澡| 在线观看免费91| 亚洲欧美综合久久久久久v动漫| 亚洲视频在线观看免费| 特级做a爱片免费69| 97se亚洲国产综合自在线| 欧美另类videos| 999精品视频在线观看| 色老头一区二区三区在线观看| 无码人妻丰满熟妇区bbbbxxxx| 91麻豆国产精品久久| 国产h视频在线播放| 欧美在线关看| 青青草一区二区| 你懂的在线看| 欧美又粗又大又爽| 神马久久久久久久久久久| 日日夜夜精品免费视频| 日韩欧美激情一区二区| 成人在线视频免费看| 三级精品视频久久久久| 一级做a爱片久久毛片| 日韩毛片视频在线看| www激情五月| 激情一区二区| 久久偷看各类wc女厕嘘嘘偷窃| 日本美女一区| 色婷婷综合成人av| 99久久精品国产色欲| 亚洲综合一二区| 精品人妻伦一二三区久| 午夜综合激情| 亚洲精品美女久久7777777| 日韩三级成人| 高清在线视频日韩欧美| 婷婷在线免费观看| 色天使色偷偷av一区二区| 色欲狠狠躁天天躁无码中文字幕 | 色综合天天综合网国产成人综合天 | 丰满放荡岳乱妇91ww| 国内性生活视频| 精品国产aⅴ| 97超级碰碰| 在线最新版中文在线| 日韩中文有码在线视频| 亚洲欧美另类一区| 在线视频一区二区三| 久草福利资源在线| 成人黄页在线观看| 美女福利视频在线| 亚洲在线久久| 欧美第一黄网| 精品中文视频| 日本国产欧美一区二区三区| 好了av在线| 日韩经典第一页| 一卡二卡三卡在线| 精品动漫一区二区| 高h视频免费观看| 337p粉嫩大胆色噜噜噜噜亚洲| 久久久精品高清| 国产一区二区精品| 欧美做暖暖视频| 俺要去色综合狠狠| 国产日韩精品久久| 不卡一区视频| 日韩免费中文字幕| 欧美亚洲天堂| 日韩在线观看成人| 你懂得网站在线| 欧美大片在线观看| 中文字幕在线观看免费| 精品女厕一区二区三区| 91插插插插插插| 中文字幕免费不卡| 新91视频在线观看| 99视频精品免费视频| 97超碰人人看| 久久99精品视频| 无码少妇一区二区三区芒果| 影音先锋一区| www.国产亚洲| 天天色综合色| 亚洲精品在线免费| 久久91麻豆精品一区| 国内一区二区三区在线视频| 免费看日产一区二区三区| 国产美女精品免费电影| 一二区成人影院电影网| 26uuu亚洲伊人春色| 精灵使的剑舞无删减版在线观看| 日韩少妇与小伙激情| 成人在线观看网站| 亚洲欧美精品在线| 婷婷视频在线观看| 亚洲国产另类 国产精品国产免费| 国产精品一区二区三区在线免费观看| 在线看日本不卡| 色老头一区二区| 色哟哟一区二区| 丁香六月婷婷综合| 欧美性生交xxxxxdddd| 青青草成人av| 精品日韩美女的视频高清| 青青操免费在线视频| 午夜一区二区三区在线观看| 精品91久久久| 欧美性猛交xxxx久久久| 免费黄色网址在线| 欧美色视频日本高清在线观看| 伊人手机在线视频| 日韩欧美在线中文字幕| 伊人中文字幕在线观看| 色婷婷精品大视频在线蜜桃视频| 影音先锋在线国产| 色综合天天综合狠狠| 久久久黄色大片| 91传媒视频在线播放| 一级片在线免费播放| 欧美视频一区二区在线观看| 自拍偷拍精品视频| 这里只有精品99re| 亚洲美女福利视频| 亚洲精品国精品久久99热| 日本福利午夜视频在线| 亚洲视频在线观看| 老司机福利在线视频| 欧美成人四级hd版| 国产污视频在线播放| 日本久久久久久久| 未满十八勿进黄网站一区不卡| 亚洲999一在线观看www| 91亚洲精品视频在线观看| 久久免费一区| 第一会所sis001亚洲| 国产av第一区| 日韩一级不卡| 国产精品一区二区小说| 国产激情精品久久久第一区二区 | 国产亚洲一区二区在线观看| 黑人と日本人の交わりビデオ| 亚洲女子a中天字幕| 亚洲精品www久久久久久| 欧美视频一区二| 精品久久国产视频| 亚洲欧美制服另类日韩| 国产盗摄在线观看| 欧美一区亚洲一区| 国产高清亚洲| 欧美精品成人一区二区在线观看| 成人a'v在线播放| 日韩av新片网| 美女免费视频一区二区| 无码国产69精品久久久久网站| 国产欧美精品一区二区三区四区 | 伊人激情综合| 欧美精品久久久久久久久25p| 国产99久久精品| 久久免费手机视频| 亚洲第一久久影院| 亚洲天堂网视频| 日韩精品中文字幕有码专区| 欧美被日视频| 日韩av电影在线播放| 一区中文字幕电影| 一本一本久久a久久精品综合妖精| 亚洲激情二区| 国产亚洲色婷婷久久| 久久综合精品国产一区二区三区| 日本视频在线免费| 色综合色综合色综合色综合色综合| av综合在线观看| 在线播放国产精品| 性欧美18~19sex高清播放| 99在线免费观看视频| 97视频精品| 少妇高清精品毛片在线视频| 不卡的看片网站| 国产a免费视频| 欧美日韩精品一区二区在线播放 | 国产调教精品| 天天爱天天做天天操| 日韩国产在线观看| 波多野结衣影院| 亚洲永久免费视频| 国产成人精品白浆久久69| 中文欧美日本在线资源| 欧美成人影院| 久久久久久一区| 亚洲欧洲另类| 涩视频在线观看| 一区二区三区四区亚洲| 国产精品视频在线观看免费| 中文字幕欧美日韩va免费视频| 国产免费不卡| 免费看成人av| 香蕉亚洲视频| 亚洲狠狠婷婷综合久久久久图片| 亚洲成va人在线观看| 亚洲第一免费视频| 欧美精品第一页在线播放| 一区二区在线免费播放| 国产真实老熟女无套内射| 国产成人在线免费观看| 久久久久久久久久久网| 精品精品欲导航| 国产蜜臀av在线播放| 国产精品18毛片一区二区| 亚洲国产1区| 水蜜桃av无码| 一本大道综合伊人精品热热| 欧美成人免费| 国产精品入口免费视频一| 久久视频在线| 被黑人猛躁10次高潮视频| 一区二区三区不卡视频 | 中文字幕日本一区| 天天做天天爱天天高潮| 国产高清久久久| 国产在线观看免费av| 日韩电影在线观看中文字幕| 亚洲一级少妇| 日韩精彩视频| 精品亚洲成av人在线观看| 欧美一区二区三区爽爽爽| 精品国产乱码久久久久久老虎| 交100部在线观看| 欧美高清视频一区二区三区在线观看| 日本中文一区二区三区| 希岛爱理中文字幕| 亚洲第一男人天堂| 日韩新的三级电影| 宅男噜噜99国产精品观看免费| 国产精品一区二区在线观看不卡| 久久久国产成人| 亚洲另类xxxx| 国产精品国产亚洲精品| 免费看欧美一级片| 久久久高清一区二区三区| 97成人在线观看| 久久久久久国产| 激情综合网站| 欧美人与性动交α欧美精品| 欧美日韩国产限制| 97人人在线| 国产精品免费在线| 日韩国产欧美视频| 国内偷拍精品视频| 亚洲性猛交xxxxwww| 国产精品一区二区三区四区在线观看 | 国产精品免费无码| 日韩精品一区二区在线| 日韩欧美看国产| 成人av在线播放观看| 久久久国产午夜精品| 性中国古装videossex| 国产成人拍精品视频午夜网站 | 欧美视频免费播放| 亚洲欧美日韩国产另类专区| 婷婷丁香一区二区三区| 91免费精品视频| 日韩在线一区二区三区| 久久亚洲av午夜福利精品一区| 中文字幕在线精品| 台湾亚洲精品一区二区tv| 精品人妻一区二区乱码| 欧美性受极品xxxx喷水| segui88久久综合9999|