数据结构 最小生成树问题

#include<stdio.h>#include<stdlib.h>#include<string.h>#definemaxvexnum100#defineinfini... #include<stdio.h>#include<stdlib.h>#include<string.h>#define maxvexnum 100#define infinite 65535 /* ∞设为双字节无符号整数的最大值65535*/typedef char vextype;typedef struct Graph{ int arc[maxvexnum][maxvexnum]; int vexnum,arcnum; } graph;void CreatGraph(graph *G)//无向图 { int i,j; scanf ("%d",&G->vexnum); for (i=0;i<G->vexnum;i++)//初始化邻接矩阵 for (j=0;j<G->vexnum;j++) G->arc[i][j]=infinite; for (i=0;i<G->vexnum;i++) for (j=0;j<G->vexnum;j++) { scanf ("%d",&G->arc[i][j]); G->arc[j][i]=G->arc[i][j]; if(G->arc[i][j]) G->arcnum++; } }int prim(graph *G){ int locate=0,i=0,j=0,k=0,l=0,min=infinite; int exist[100],count=0,totalmin=0,exchange=0,now=0;//将exist分成两块 count之前的为已经纳入最小生成树中的节点 (包括count),count之后的为不在最小生成树中的节点 for(i=0;i<G->vexnum;i++) exist[i]=i; while(count!=G->vexnum-1)//直到count的值等于总节点的值 { min=infinite; for(k=0;k<=count;k++) { for(j=G->vexnum-1;j>count;j--) { if(G->arc[exist[k]][exist[j]]<min&&G->arc[exist[k]][exist[j]]!=0)//如果有更小的权值,将现在j的值付给now { min=G->arc[exist[k]][exist[j]]; now=j; } } } exchange=exist[count+1];//将现在的now纳入最小生成树中(即交换后将count值+1) exist[count+1]=exist[now]; exist[now]=exchange; count++; totalmin=totalmin+min; } return totalmin;}int main(void){ graph G; int min; CreatGraph(&G); min=prim(&G); printf("%d",min); return 0;}/*输入: 40 4 9 21 4 0 21 179 21 0 1621 17 16 0输出:28*/ 请问我这样写有错误吗? 为什么poj过不去? 展开
 我来答
一阅原老汇远的1216
2018-12-15 · TA获得超过3412个赞
知道大有可为答主
回答量:6214
采纳率:60%
帮助的人:651万
展开全部
该算法以贪心为基础,每次保证了添加生成的树一定是最小生成树
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式