一步一步复习数据结构和算法基础-prim算法(最小生成树)

来源:互联网 发布:软件专利技术交底书 编辑:程序博客网 时间:2024/06/05 08:16
#include<stdio.h>#include<stdlib.h>#include<string.h>#define number 20#define MAX 99999typedef struct node{int info;//图的节点存放的信息,可随时变动}GraphNode;typedef struct{GraphNode matrix[number+1][number+1];//构造邻接矩阵int vexs[number+1];//顶点向量int vertex,edge;//顶点个数、弧个数}Graph;//创建图void CreatGraph(Graph *G){int i,k;int x,y,data;int vertex,edge;printf("输入图的顶点个数和边的个数.\n");scanf("%d%d",&vertex,&edge);G->vertex = vertex;G->edge = edge;printf("输入图的每个顶点.\n");for(i=1;i<=vertex;i++)scanf("%d",&G->vexs[i]);for(i=1;i<=vertex;i++)for(k=1;k<=vertex;k++)G->matrix[i][k].info = MAX;printf("请输入 %d 条边的横坐标、纵坐标、数值.\n",edge);for(i=1;i<=edge;i++){scanf("%d%d%d",&x,&y,&data);G->matrix[x][y].info=data;G->matrix[y][x].info=data;}}//找出给定顶点的位置int LocateVex(Graph *G,int V){int i;for(i=1;i<=G->vertex;i++)if(G->vexs[i] == V)return i;return -1;//失败返回-1}void RecoverGraph(Graph *G){int i,k;for(i=1;i<=G->vertex;i++)for(k=1;k<=G->vertex;k++)G->matrix[i][k].info=0;memset(G->vexs,0,sizeof(G->vexs));G->vertex = G->edge = 0;}//从指定顶点出发构造最小生成子树void Prim(Graph *G,int v){int lowcost[number+1];//存放弧int i,j,m,min;int k = LocateVex(G,v);//寻找顶点的位置for(j=1;j<=G->vertex;j++){if(j!=k){lowcost[j] = G->matrix[k][j].info;//辅助数组初始化}}lowcost[k] = 0;printf("%d",v);for(j=2;j<=G->vertex;j++){min=99999;//寻找下一个顶点for(m=1;m<=G->vertex;m++){if(lowcost[m]!=0 && lowcost[m] < min){min = lowcost[m];k = m;}}//输出寻找到的顶点printf("--->%d",G->vexs[k]);lowcost[k] = 0;//新定点加入后重新最小边for(i=1;i<=G->vertex;i++)if(G->matrix[k][i].info < lowcost[i]){lowcost[i] = G->matrix[k][i].info;}}printf("\n");}int main(){Graph G;CreatGraph(&G);Prim(&G,1);RecoverGraph(&G);return 0;}/************************************************************************//*    //顶点个数和弧的个数6 10//顶点1 2 3 4 5 6//弧1 2 62 5 35 6 66 4 24 1 51 3 12 3 55 3 66 3 44 3 5*//************************************************************************/

原创粉丝点击