日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

最小生成树prim (c++ 已大改)

發布時間:2025/3/8 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最小生成树prim (c++ 已大改) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

#include?<iostream> #include?<vector> #include?<set> #include?<map> #include?<initializer_list> #include?<memory> template<typename?T> class?Graph{private:std::map<T,?map<T,?unsigned?int>>?graph;?//存儲無向圖.?std::map<T,?std::vector<T>>?edge;?//鄰接鏈表.?也就是說給定一個結點另外有多少個結點是與其相連接的.?std::queue<T>?vertex;?//存儲所有的結點.?std::set<T>?memberFromQueue;?//從棧內彈出的元素放到set中.std::vector<T>?currentVertex;unsigned?int?vertexNumber;public:template<typename?Ty,?unsigned?int?N>Graph(const?Ty?(&edges)[N][3]);~Graph();void?primAlgorithm(); }; template<typename?T> template<typename?Ty,?unsigned?int?N> Graph<T>::Graph(const?Ty?(&edges)[N][3]):vertex(nullptr),vertexNumber(vertexs.size()) {if(vertexs.size()?==?0){throw?std::bad_cast();}std::cout<<"enter?successfully"<<std::endl;for(int?i=0;?i<N;?++i){this->graph[edges[i][0]][edges[i][2]]?=?edges[i][1];?//map的特性就是如果其中不含有edges[i][0]以及edge[i][0]元素就會自動創建一個.?this->graph[edges[i][2]][edges[i][0]]?=?edges[i][1];this->edge[edges[i][0]].push_back(edges[i][2]);?//與結點edges[i][0]相接的所有結點,被放到與其對應的vector中.?this->edge[edges[i][2]].push_back(edges[i][0]);?//同上.?}for(std::map<Ty,?std::map<Ty,?unsigned?int>>::const_iterator?it?=?this->edge.cbegin();?it?!=?this->edge.cend();?++it){?//把所有結點都放到vertex中.?this->vertex.push(it->first);}std::cout<<"out"<<std::endl; } template<typename?T> void?Graph<T>::primAlgorithm() {T?head;int?total?=?0;head?=?this->vertex.front();?//彈出棧內第一個元素.?this->vertex.pop();?//刪除該元素.this->memberFromQueue.insert(head);this->currentVertex.push_back(head);while(?!this->vertex.empty()?){?//當給定的無向圖不為空.?int?i=0;int?j=0;int?min=0;int?flag?=0;T?start;T?end;for(i=0;?i<this->currentVertex.size();?++i){?//當前頂點.?for(j=0;?i<this->edge[this->currentVertex[i]].size();?++j){?//與當前頂點(head)相連接的有多少個頂點,?逐個訪問這些與當前頂點相連接的結點.?if(this->memberFromQueue.find(this->edge[this->currentVertex[i]][j])?==?this->memberFromQueue.end()){?//查找當前頂點時候存在memberFromQueue中.?if(flag?==?0){?//如果給定的頂點是樹中的第一個.?那么令min等于當前頂點與任意一邊的加權值.?min?=?this->graph[this->currentVertex[i]][this->edge[this->currentVertex[i]][j]];?//獲得的是currentVertex[i]?和?edge[currentVertex[i]]?[j]?這兩個結點的加權值.flag?=?1;?}if(this->graph[this->currentVertex[i]][this->edge[this->currentVertex[i]][j]]?<=?min){min?=?this->graph[this->currentVertex[i][this->edge[this->currentVertex[i]][j]];start?=?this->currentVertex[i];end?=?this->edge[this->currentVertex[i]][j];}}}}std::cout<<start<<"----"<<min<<"-----"<<end<<std::endl;//輸出邊以及加權值.this->vertex.pop();?//刪除棧內當前的頂點元素.this->memberFromQueue.insert(end);this->currentVertex.push_back(end);?}}

轉載于:https://my.oschina.net/SHIHUAMarryMe/blog/601102

總結

以上是生活随笔為你收集整理的最小生成树prim (c++ 已大改)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。