最小生成树prim (c++ 已大改)
生活随笔
收集整理的這篇文章主要介紹了
最小生成树prim (c++ 已大改)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2019獨角獸企業(yè)重金招聘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]元素就會自動創(chuàng)建一個.?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++ 已大改)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载]使用awk进行数字计算,保留指定
- 下一篇: ZeroMQ--使用jzmq进行编程