[数据结构] 图的Kruskal算法实现
来源:互联网 发布:软件测试策略 编辑:程序博客网 时间:2024/05/16 17:24
<pre name="code" class="cpp">#include <iostream>using namespace std; #define MAX_V 100 //定义最大顶点个数#define INF 1000 //表示正无穷 typedef struct VertexType{ int number;//顶点标号};//顶点类型typedef struct MGraph//图的定义{ int matrix[MAX_V][MAX_V];//邻接矩阵 int weight[MAX_V][MAX_V];//存放权值 int v;//顶点数int e;//边数 VertexType vertax[MAX_V];//存放顶点信息};//图的邻接矩阵类型typedef struct Edge{int v1;int v2;int weight;};//边的存储类型 void CreateMGragh(MGraph *G){int i,j,m,weight;cout << "请输入顶点数和边数:" << endl;cin >> G->v >> G->e ;cout << "请输入顶点信息:" << endl;for (i=0;i<G->v;i++){ scanf("%d",&G->vertax[i].number);//输入顶点信息,建立顶点表}for (i=0;i<G->v;i++)//初始化邻接矩阵 for (j=0;j<G->v;j++) { G->matrix[i][j]=0; G->weight[i][j]=INF;//让所有权值不存在 } for(i=0;i<G->v;i++)//是结点自身指向自身权值为0 for(j=0;j<G->v;j++) if(i==j) G->weight[i][j]=0;cout << "输入每条边的首尾顶点序号及权值:" << endl;for (m=0;m<G->e;m++){cin >> i >> j >> weight; // >> weight;G->matrix[i][j]=1;G->matrix[j][i]=1;G->weight[i][j]=weight;G->weight[j][i]=weight;}}void DisplayMGragh(MGraph *G)//输出邻接矩阵G{ int i,j; for(i=0;i<G->v;i++) { for(j=0;j<G->v;j++) printf("%5d",G->matrix[i][j]); printf("\n"); } cout << endl;}void DisplayMGragh_W(MGraph *G)//输出权值矩阵G{ int i,j; for(i=0;i<G->v;i++) { for(j=0;j<G->v;j++) printf("%5d",G->weight[i][j]); printf("\n"); } cout << endl;}void Sort(Edge EdgeCount[], MGraph *G) // 给边进行升序排序 {int i,j;Edge temp;for(i = 0; i < G->v; i++){for(j = i; j <= G->v; j++){if(EdgeCount[j].weight < EdgeCount[i].weight){temp.v1 = EdgeCount[i].v1;temp.v2 = EdgeCount[i].v2;temp.weight = EdgeCount[i].weight;EdgeCount[i].v1 = EdgeCount[j].v1;EdgeCount[i].v2 = EdgeCount[j].v2;EdgeCount[i].weight = EdgeCount[j].weight;EdgeCount[j].v1 = temp.v1;EdgeCount[j].v2 = temp.v2;EdgeCount[j].weight = temp.weight;}}}}void Kruskal(MGraph *G) {Edge EdgeCount[10];//记录边数 int vset[MAX_V];int k = 0;int m = G->v;int i,j,s1,s2; for(i = 0; i < G->v; i++){ for(j = 0; j < G->v; j++) { if(G->matrix[i][j] != 0)//如果两条边是连通的 { if(i < j) { EdgeCount[k].v1 = i; EdgeCount[k].v2 = j; EdgeCount[k].weight = G->weight[i][j]; k++; } } }}Sort(EdgeCount, G); for (i=0;i<G->v;i++)//初始化辅助数组 { vset[i]=i; } i = 0; while(m > 1)//最小生成树边数为顶点数-1 {s1 = vset[EdgeCount[i].v1];s2 = vset[EdgeCount[i].v2];if(s1 != s2){cout << EdgeCount[i].v1 << "--" << EdgeCount[i].v2 << endl;m--;for(j = 0; j < G->v; j++)//改变连通分量的根节点 {if(vset[j] == s2) vset[j] = s1;}}i++;}}int main(){MGraph *M;M = new MGraph;CreateMGragh(M);DisplayMGragh(M);DisplayMGragh_W(M); Kruskal(M);return 0;}
0 0
- [数据结构] 图的Kruskal算法实现
- 【算法和数据结构】1.10--图的最小生成树之Kruskal算法(C++实现)
- kruskal算法的实现
- Kruskal算法的实现
- kruskal算法的实现
- 数据结构之图---最小生成树Kruskal算法---C++实现
- Kruskal算法的JAVA实现
- kruskal算法的c++实现
- 第十三周--数据结构-Kruskal算法的验证
- 数据结构(C实现)------- 最小生成树之Kruskal算法
- 图的最小生成树:Kruskal算法实现
- 实现Kruskal算法,求图的最小生成树。
- 图的最小生成树 Kruskal算法 C++实现
- 使用C++邻接矩阵实现图的存储、Prim、Kruskal算法
- C语言实现图的Kruskal最小生成树算法
- 基本数据结构(图: 基本结构,DFS,prim算法, kruskal算法)
- Kruskal算法的设计与实现
- Kruskal算法的并查集实现
- Lambda表达式详解
- Ural1209(数学推导)
- uva 757 Gone Fishing (贪心)
- C++之友元函数和友元类
- R中的apply、lapply和sapply
- [数据结构] 图的Kruskal算法实现
- MPlayer移植到EPC9600笔记
- 【OpenCV】 split和merge操作
- [LeetCode] 021. Merge Two Sorted Lists (Easy) (C++/Python)
- HttpClient模块的HttpGet和HttpPost及Connection to refuse解决
- 用python脚本替换某文件夹下配置文件的$HOME
- C++ 类的析构函数学习笔记7
- Spring Resources接口
- 使用svn与eclipse管理本地代码