数据结构_图_prim最小生成树算法
2013-06-19 13:24
525 查看
#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<limits.h> #define MAX_VERTEX_NUM 20 typedef enum{DG, DN, UDG, UDN} GraphKind; typedef int VRType; //边的信息 typedef char VertexType; //顶点的信息 typedef struct ArcCell{ VRType adj; //保存边的权值 }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//图的邻接矩阵,保存边的信息 typedef struct{ VertexType vex[MAX_VERTEX_NUM]; //保存顶点的信息,在本图中,顶点的信息由字符表示 AdjMatrix arcs; //图的邻接矩阵 int vexnum, arcnum; //保存图的顶点数和边数 GraphKind kind; //图的种类 }MGraph; typedef struct{ //辅助数组,记录U到V-U的代价最小的边的辅助数组 VertexType adjvex; //顶点集U到该点为最小权值的那个顶点的序号 VRType lowcost; //上面adjvex顶点到这个顶点的最小权值 }minside[MAX_VERTEX_NUM]; int LocateVex(MGraph G, VertexType u){ //寻找顶点在图中的序号 int i = 0; for(i = 0; i < G.vexnum; i++) if(G.vex[i] == u) return i; return -1; } int minimum(minside SZ, MGraph G){//在辅助数组中找到权值最小的边 int i, j, min, k; for(i = 0; SZ[i].lowcost==0; i++)//找到第一个不为0的SZ[i].lowcost的位置 ; min = SZ[i].lowcost; k = i; for(j = 0; j < G.vexnum; j++) if(SZ[j].lowcost > 0 && SZ[j].lowcost < min){ min = SZ[j].lowcost; k = j; } return k; } void MiniSpanTree_Prim(MGraph G, VertexType u){ minside closedge;//定义辅助数组 int i, j; int k = LocateVex(G, u); for(j = 0; j < G.vexnum; j++)//辅助数组初始化,此时讲u这个点包含到U中。 if(j != k){ closedge[j].adjvex = u; //此时数组中距离都是顶点u到其它所有结点的距离 closedge[j].lowcost = G.arcs[k][j].adj;//顶点u到所有结点的权值 } closedge[k].lowcost = 0; //值为0表示该点以进入到集合U中 printf("最小代价生成树的各条边为\n"); for(i = 1; i < G.vexnum; i++){ k = minimum(closedge,G); printf("加入的第%d条为%c到%c\n", i, closedge[k].adjvex, G.vex[k]); closedge[k].lowcost = 0; //值为k的结点进如U中 for(j = 0; j < G.vexnum; j++) //与k相关联的结点,如果U中k节点到V-U的结点距离小于以前的距离,则修改辅助数组的值 if(G.arcs[k][j].adj < closedge[j].lowcost) { closedge[j].adjvex = G.vex[k]; closedge[j].lowcost = G.arcs[k][j].adj; } } } int main() { FILE * p_file; if(!(p_file = fopen("D:\\test.txt","r"))) { printf("open error\n"); return 0; } int i, j; MGraph G; G.kind = DG; G.arcnum = 10; G.vexnum = 6; for(i = 0; i< G.vexnum;i++) G.vex[i] = (char)(97 + i); char tail[MAX_VERTEX_NUM], head[MAX_VERTEX_NUM];//保存所有边的起始位置和终点位置 int cost[MAX_VERTEX_NUM];//保存相对应边的权值 for(i = 0; i < G.arcnum;i++) { fscanf(p_file, "%c%c%d",&tail[i], &head[i], &cost[i]); } for(i = 0; i < G.vexnum;i++) for(j = 0; j < G.vexnum; j++) G.arcs[i][j].adj = SHRT_MAX; for(i = 0; i < G.arcnum;i++){ int m = LocateVex(G, tail[i]); int n = LocateVex(G, head[i]); G.arcs[m] .adj = cost[i]; G.arcs [m].adj = cost[i]; } for(i = 0; i < G.vexnum;i++){ for(j = 0; j < G.vexnum; j++) printf("%6d ",G.arcs[i][j].adj); printf("\n"); } MiniSpanTree_Prim(G, 'a'); }
txtz中保存的数据如下,ab6be3ef6fd2da5ac1bc5dc5ec6fc4。
其中v1到v6在代码中用点a到点f来表示。如代码有错误,望不吝赐教!
相关文章推荐
- 数据结构之最小生成树的Prim和Kruskal`s 算法
- hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)
- 数据结构 学习笔记(九):图(下):最小生成树(Prim,Kruskal 算法),拓扑排序 AOV,关键路径 AOE
- PAT 数据结构 06-图6. 公路村村通(30)Prim最小生成树算法
- [数据结构]最小生成树算法Prim和Kruskal算法
- 构造最小生成树的 prim 算法
- 数据结构 C语言 最小生成树 prim kruskal
- C++ 最小生成树之Prim(普里姆)算法
- 最小生成树 Prim 算法
- Prim最小生成树算法
- python实现prim 最小生成树算法
- 贪心算法之Prim最小生成树
- 数据结构-图-最小生成树_Prim
- 15分钟掌握最小生成树普利姆(Prim)算法
- 图的广度遍历、深度遍历及最小生成树书算法(Prim、Kruskal)
- hdu 1233 还是畅通工程(最小生成树的Prim和Kruskal两种算法的c++实现)(prim算法详解)
- 最小生成树之Prim(普里姆)算法
- 最小生成树Prim算法理解
- 最小生成树(Prim)算法
- 关于最小生成树的 prim 算法