poj2395Kruscal最小生成树
来源:互联网 发布:金融数据分析师骗局 编辑:程序博客网 时间:2024/06/10 04:26
水题一道,关键是理解题目为最小生成树。纯粹为了复习并查集和Kruscal最小生成树。
#include <iostream>#include <vector>#include <algorithm>using namespace std;class Edge{public:int nId1,nId2;int length;};class LinkNode{public:LinkNode(){nodeID=-1;length=-1;nextNode=NULL;}int nodeID;int length;LinkNode* nextNode;};class Node{public:Node(){nodeID=0;parent=NULL;rank=0;linkNodes=NULL;}int nodeID;Node* parent;int rank;LinkNode* linkNodes;bool AddLinkNode(Edge edge);};bool Node::AddLinkNode(Edge edge){int linkID=-1;if(edge.nId1==nodeID){linkID=edge.nId2;}else{linkID=edge.nId1;}if(linkNodes==NULL){linkNodes=new LinkNode();linkNodes->length=edge.length;linkNodes->nodeID=linkID;return true;}else{LinkNode* tLinkNode=linkNodes;while(tLinkNode->nextNode!=NULL && tLinkNode->nodeID!=linkID){tLinkNode=tLinkNode->nextNode;}if(tLinkNode->nextNode==NULL){LinkNode* newLinkNode=new LinkNode();newLinkNode->length=edge.length;newLinkNode->nodeID=linkID;tLinkNode->nextNode=newLinkNode;return true;}else {if(tLinkNode->length>edge.length){tLinkNode->length=edge.length;return true;}}}return false;}class Graph{public:vector<Node> nodeVec;vector<Edge> edgeVec;int iNodeNum;int iEdgeNum;bool InsertEdge(Edge edge);};bool Graph::InsertEdge(Edge edge){if(nodeVec[edge.nId1].AddLinkNode(edge) && nodeVec[edge.nId2].AddLinkNode(edge)){edgeVec.push_back(edge);return true;}return false;}bool SortEdge(Edge e1,Edge e2){return e1.length<e2.length;}void MakeSet(Node& x){x.parent=&x;x.rank=0;}Node* FindSet(Node* node){if(node->parent != node){node->parent=FindSet(node->parent);}return node->parent;}void LinkTwoTree(Node* pNode1,Node* pNode2){if(pNode1->rank>pNode2->rank){pNode2->parent=pNode1;}else if(pNode1->rank<pNode2->rank){pNode1->parent=pNode2;}else{pNode1->parent=pNode2;pNode2->rank++;}}void UnionSets(Node* pNode1,Node* pNode2){LinkTwoTree(FindSet(pNode1),FindSet(pNode2));}vector<Edge>* MinSpanTree_Kruscal(Graph graph){vector<Edge> *mSpanTree=new vector<Edge>();for(vector<Node>::iterator nodeIter=graph.nodeVec.begin();nodeIter!=graph.nodeVec.end();nodeIter++){MakeSet(*nodeIter);}sort(graph.edgeVec.begin(),graph.edgeVec.end(),SortEdge);int iUnionNumber=0;for(vector<Edge>::iterator edgeIter=graph.edgeVec.begin();edgeIter!=graph.edgeVec.end();edgeIter++ ){if(FindSet( &graph.nodeVec[edgeIter->nId1-1] ) != FindSet(&graph.nodeVec[edgeIter->nId2-1])){UnionSets(&graph.nodeVec[edgeIter->nId1-1],&graph.nodeVec[edgeIter->nId2-1]);mSpanTree->push_back(*edgeIter);}}return mSpanTree;}int main(){Graph graph;int ai,bi,len;int n,m;cin>>n>>m;graph.iNodeNum=n;graph.iEdgeNum=m;for(int i=0;i<n;i++){graph.nodeVec.push_back(Node());}for(int i=0;i<m;i++){cin>>ai>>bi>>len;Edge edge;edge.nId1=ai;edge.nId2=bi;edge.length=len;graph.edgeVec.push_back(edge);}vector<Edge>mSpanTree=*MinSpanTree_Kruscal(graph);cout<<mSpanTree[mSpanTree.size()-1].length<<endl;return 0;}
- poj2395Kruscal最小生成树
- 最小比例 最小生成树
- 最小生成树&&次最小生成树
- 最小生成生成树计数
- 树+最小生成树
- 最小生成树
- 最小生成树 MST
- 最小生成树Kruskal
- kruskal 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树 MST
- 最小生成树问题
- 最小生成树
- 最小生成树
- 最小生成树
- 数据库 数据冗余
- java答案
- 矢量图标的管理和应用
- c++中static的作用
- android ICS4.0.3 切换到tablet模式,systemUi报错
- poj2395Kruscal最小生成树
- android ICS4.0.3去掉相机全景模式
- flash actionscript 3.0 发布H264的视频流
- XMLEventReader读取数据不全
- GCC 静态库和动态库
- Http环境下的保持连接方式
- Android build environment
- c c++ java的区别
- SWIG