kruskal最小生成树(MST)算法

来源:互联网 发布:联想笔记本网络开关 编辑:程序博客网 时间:2024/05/17 15:59

该算法适用于边稀疏而顶点较多的图!!

这里写图片描述

关键是不构成回路的判断
例子:
这里写图片描述

代码:

#include<iostream>#include<queue>using namespace std;struct EdgeNode{int v1;int v2;int value;bool operator<(const EdgeNode &a) const  //定义一个比较边大小的符号重载             {return a.value<value;}};int *root;priority_queue<EdgeNode> pq; //优先级队列int Find(int x)  // x是某个顶点的编号{int i=x;while(i!=root[i])i=root[i];while(i!=root[x]){x=root[x];root[x]=i;}return i;}void Union(int a,int b)  // a、b是对应于某条边的两个顶点编号{a=Find(a);b=Find(b);if(a!=b)root[a]=b;}void Kruskal(){EdgeNode b;cout<<" 加入最小生成树中的边依次为 : "<<endl;while(!pq.empty()){b=pq.top();pq.pop();if(Find(b.v1)!=Find(b.v2)){cout<<b.v1<<"----"<<b.v2<<endl;Union(b.v1,b.v2);}}}int main(){int n=0;int m=0;cout<<" 请输入图中点的个数 : "<<endl;cin>>n;root=new int [n+1]; //为啥是n+1,因为下面点的编号从1开始,则共需_n+1个下标for(int i=1;i<=n;i++)root[i]=i;cout<<" 请输入图中边的条数 : "<<endl;cin>>m;EdgeNode a;cout<<" 请依次输入每条边的两个顶点及其权重 : "<<endl;while(m--){cin>>a.v1>>a.v2>>a.value;pq.push(a);}Kruskal();return 0;}
0 0
原创粉丝点击