最小生成树的 克鲁斯卡尔算法
2015-06-24 17:56
288 查看
#include<iostream> using namespace std; //该算法的时间复杂度为O(elge);Kruskal算法的时间主要取决于边数,它较适合于稀疏图。 #define MAX_VERTEX_SIZE 15 #define MAX_EDGE_SIZE 15 typedef char vertex; typedef struct edge { int m; int n; int w; }edge,*pEdge; typedef struct Graph { edge e[MAX_EDGE_SIZE+1]; vertex v[MAX_VERTEX_SIZE+1]; int vnum,linenum; }Graph,*G; int indexof(G &g,vertex c) { for(int i=1;i<=g->vnum;i++) { if(c==g->v[i]) return i; } return -1; } void sort(G &g) { for(int i=1;i<g->linenum;i++) { for(int j=i+1;j<=g->linenum;j++) { if(g->e[j].w<g->e[i].w) { swap(g->e[i],g->e[j]); } } } } void create_graph(G &g) { vertex a,b; int ind1,ind2; g=(G)malloc(sizeof(Graph)); cout<<"请输入顶点的数目"<<endl; cin>>g->vnum; for(int i=1;i<=g->vnum;i++) { cout<<"请输入第"<<i<<"个顶点"<<endl; cin>>g->v[i]; } cout<<"请输入边的数目"<<endl; cin>>g->linenum; for(int i=1;i<=g->linenum;i++ ) { cout<<"请输入第"<<i<<"条边的顶点"<<endl; cin>>a; cin>>b; ind1=indexof(g,a); ind2=indexof(g,b); g->e[i].m=ind1; g->e[i].n=ind2; cout<<"请输入第"<<i<<"条边的权值"<<endl; cin>>g->e[i].w; } //打印创建的边信息 cout<<"创建的边信息:"<<endl; for(int i=1;i<=g->linenum;i++) { cout<<g->e[i].m<<" "<<g->e[i].n<<" "<<g->e[i].w<<endl; } //根据权值由低到高对边进行排序 sort(g); cout<<"排序后的边信息:"<<endl; for(int i=1;i<=g->linenum;i++) { cout<<g->e[i].m<<" "<<g->e[i].n<<" "<<g->e[i].w<<endl; } } void kruskal(G &g) { int vp[MAX_VERTEX_SIZE];//vp里面存放不同连通分量的标签 int result[MAX_EDGE_SIZE];//加入生成树的边为1,初始化为0 int m,n,tmp; for(int i=1;i<=g->vnum;i++) { vp[i]=i;//初始时各个连通分量均不相同 } for(int i=1;i<=g->linenum;i++) { result[i]=0; } for(int i=1;i<=g->linenum;i++) { m=g->e[i].m; n=g->e[i].n; if(vp[m]!=vp ) { tmp=vp ; for(int j=1;j<=g->vnum;j++) { if(vp[j]==tmp) { vp[j]=vp[m]; } } result[i]=1; } } cout<<"输出结果 result:"<<endl; for(int i=1;i<=g->linenum;i++) { cout<<result[i]<<" "; } cout<<endl; cout<<"输出结果 vp:"<<endl; for(int i=1;i<=g->vnum;i++) { cout<<vp[i]<<" "; } cout<<endl; } void main() { G g; create_graph(g); system("pause"); kruskal(g); system("pause"); }
相关文章推荐
- Xcode 6制作动态及静态Framework
- JavaScript高阶函数
- [POJ 3498] March of the Penguins
- js 修改css属性值
- C++中static_cast, dynamic_cast用法
- android 5.0 远程开启服务学习笔记
- 运算符和表达式(一)
- MDK配置jlink仿真器步骤
- C/C++中如何获取数组的长度?
- 【性能诊断】十一、性能问题综合分析(案例2,windbg、wireshark)
- <转载> OpenGL Projection Matrix
- python学习随笔
- js怎么获取图片的相对地址
- Linux中长时间运行脚本或者命令
- AN service读code小结
- linux下yum安装配置zabbix监控
- Android带有undo,redo功能的EditText
- Xcode Cocoa程序MessageBox 弹框
- 排序算法系列之归并排序
- websocket——Firefox 无法建立到 ws://... 服务器的连接