//此代码是数据结构的原始模板,可以刚接触或考研时借鉴下,不适于刷题 #include<stdio.h> #include<malloc.h> #define INFINITY 32768 #define MAX_VERTEX_NUM 20 int visited[100]; typedef struct node1 { int adj; }gra; typedef struct node2 { gra arcs[100][100]; int vertex[100]; int vexnum,arcnum; }*graph,graph1; typedef struct node3 { int adjvex; int lowcost; }*close1,close2; typedef struct node4 { close2 closedge[MAX_VERTEX_NUM]; }*close3,close4; int locatevertex(graph &g,int v) { int j=0,k; for(k=0;k<g->vexnum;k++) { if(g->vertex[k]==v) { j=k; break; } } return j; } void create(graph &g) { int i,j,k,weight,v1,v2; printf("请输入图的最大顶点数和最大弧数: "); scanf("%d%d",&g->vexnum,&g->arcnum); for(i=0;i<g->vexnum;i++) { for(j=0;j<g->vexnum;j++) { g->arcs[i][j].adj=INFINITY; } } printf("请输入图的各顶点值: "); for(i=0;i<g->vexnum;i++) scanf("%d",&g->vertex[i]); for(k=0;k<g->arcnum;k++) { printf("请输入两顶点表示有关系,及其权值: "); scanf("%d%d",&v1,&v2); i=locatevertex(g,v1); j=locatevertex(g,v2); scanf("%d",&weight); g->arcs[i][j].adj=weight; g->arcs[j][i].adj=weight; } } int minium(graph &g,close3 &clos) { int min=INFINITY; for(int i=0;i<g->vexnum;i++) { if(min>clos->closedge[i].lowcost&&clos->closedge[i].lowcost!=0) { min=clos->closedge[i].lowcost; } } for(i=0;i<g->vexnum;i++) { if(clos->closedge[i].lowcost==min) { return i; } } } void minispantree_prim(close3 &clos,graph &g,int u) { int k,k0,u0,v0; k=locatevertex(g,u); clos=(close3)malloc(sizeof(close4)); clos->closedge[k].lowcost=0; for(int i=0;i<g->vexnum;i++) { if(i!=k) { clos->closedge[i].adjvex=u; clos->closedge[i].lowcost=g->arcs[k][i].adj; } } printf("输出生成树的当前最小边: "); for(int e=1;e<=g->vexnum-1;e++) { k0=minium(g,clos); u0=clos->closedge[k0].adjvex; v0=g->vertex[k0]; printf("(%d,%d)",u0,v0); clos->closedge[k0].lowcost=0; for(i=0;i<g->vexnum;i++) { if(g->arcs[k0][i].adj<clos->closedge[i].lowcost) { clos->closedge[i].lowcost=g->arcs[k0][i].adj; clos->closedge[i].adjvex=v0; } } } } int main() { graph g; close3 clos; g=(graph)malloc(sizeof(graph1)); create(g); minispantree_prim(clos,g,g->vertex[0]); printf("\n"); return 0; }