回 帖 发 新 帖 刷新版面

主题:请问这个prim算法错在哪?

[em7]

#define MAXVEX 30
#define MAXCOST 1000
void prim(int c[MAXVEX][MAXVEX],int n)
{
    int i,j,k,min,lowcost[MAXVEX],closest[MAXVEX];
    bool s[MAXVEX];
    s[1]=true;
    for(i=2;i<=n;i++)
    {
        lowcost[i]=c[1][i];
        closest[i]=1;
        s[i]=false;
    }
    for(i=1;i<=n;i++)
    {
        min=MAXCOST;
        j=1;
        for(int k=2;k<=n;k++)
    
            if(lowcost[k]<min&&(!s[k]))
            {
                min=lowcost[k];
                j=k;
            }
        
        printf("(%d,%d): %d \n",closest[j],j,lowcost[i]);
        s[j]=true;
        for(k=2;k<=n;k++)
            if(c[j][k]<lowcost[k]&&(!s[k]))
            {
                lowcost[k]=c[j][k];
                closest[k]=j;
            }
    }
}
void main()
{
    int n=7,i,j,mx[MAXVEX][MAXVEX];
    for(i=0;i<=n;i++)
        for(j=0;j<=n;j++)
            mx[i][j]=MAXCOST;
        mx[1][2]=50;
        mx[1][3]=60;
        mx[2][4]=65;
        mx[2][5]=40;
        mx[3][4]=52;
        mx[3][7]=45;
        mx[4][5]=50;
        mx[5][6]=70;
        mx[4][6]=30;
        mx[4][7]=42;
        printf("最小生成树边集:\n  ");
        prim(mx,n);
}

回复列表 (共4个回复)

沙发

看看

板凳

顶一下.

3 楼


for(int k=2;k<=n;k++)
这句k重复定义

printf("(%d,%d): %d \n",closest[j],j,lowcost[i]);
这句输出lowcost[i]没有什么意义。当第一次输出时即:lowcost[1],由于它
并没有初始化,所以会输出一个随机值。

其他的应该加些注释,才能让人比较好理解每个变量的意义。

除此之外似乎没有问题了。

4 楼


        min=MAXCOST;
        j=1;
这句j = 1还应该改成j=2;没有必要从1开始扫描。

我来回复

您尚未登录,请登录后再回复。点此登录或注册