void Kruskal(MGraph &G) //克鲁斯卡尔算法 { int i,j,u1,v1,sn1,sn2,k; int vset[M]; Edge E[M]; k=0; for (i=0;i<G.n;i++) { for (j=0;j<G.n;j++) { if (G.edeges[i][j]!=0&&G.edeges[i][j]!=N) { E[k].u=i; E[k].v=j; E[k].w=G.edeges[i][j]; k++; } } } InsertSort(E,G.e); for (i=0;i<G.n;i++) vset[i]=i; k=1; j=0; while (k<G.n) { u1=E[j].u; v1=E[j].v; sn1=vset[u1]; sn2=vset[v1]; if (sn1!=sn2) { printf("<%c,%c>:%d\n",G.vexs[u1],G.vexs[v1],E[j].w); k++; for (i=0;i<G.n;i++) { if (vset[i]==sn2) { vset[i]=sn1; } } } j++; } }这一部分的源代码哪里出错了
时间: 2023-06-14 08:07:13 浏览: 123
这段代码实现了最小生成树的 Kruskal 算法,但是在代码中有一些拼写错误,需要进行修改:
1. 在第 5 行,将 `int vset[M];` 改为 `int vset[N];`,因为节点数是 N 而不是 M。
2. 在第 23 行,将 `InsertSort(E,G.e);` 改为 `InsertSort(E,G.e_num);`,因为 `e_num` 才是边数。
3. 在第 30 行,将 `printf("<%c,%c>:%d\n",G.vexs[u1],G.vexs[v1],E[j].w);` 改为 `printf("<%c,%c>:%d\n",G.vertex[u1],G.vertex[v1],E[j].weight);`,因为 `vertex` 才是顶点数组,`weight` 才是边权值。
修改后的代码如下:
```c
void Kruskal(MGraph &G) //克鲁斯卡尔算法
{
int i,j,u1,v1,sn1,sn2,k;
int vset[N];
Edge E[M];
k=0;
for (i=0;i<G.n;i++)
{
for (j=0;j<G.n;j++)
{
if (G.edges[i][j]!=0&&G.edges[i][j]!=N)
{
E[k].u=i;
E[k].v=j;
E[k].weight=G.edges[i][j];
k++;
}
}
}
InsertSort(E,G.e_num);
for (i=0;i<G.n;i++)
vset[i]=i;
k=1;
j=0;
while (k<G.n)
{
u1=E[j].u;
v1=E[j].v;
sn1=vset[u1];
sn2=vset[v1];
if (sn1!=sn2)
{
printf("<%c,%c>:%d\n",G.vertex[u1],G.vertex[v1],E[j].weight);
k++;
for (i=0;i<G.n;i++)
{
if (vset[i]==sn2)
{
vset[i]=sn1;
}
}
}
j++;
}
}
```
阅读全文