微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用优先队列的 Prim 算法

如何解决使用优先队列的 Prim 算法

新来的,需要你的帮助。我们被要求为 Prim 的算法使用优先队列和堆,但我被卡住了。我知道是 shiftUp() 函数搞砸了,导致程序的纸牌房子比可口可乐的价格下降得更快,但我无法解决这个问题。 这是我的代码

 #include <stdio.h>
#define MAX 10000
typedef struct priority
{
    int edge_1st;
    int edge_2nd;
    int arr[MAX];

}pq;
pq ptr;
int insert(int);
int counter[MAX],size,cost;
void primoperate();
int extract();
int shiftUp(int);
int shiftDown(int);
int parent(int);
int leftChild(int);
int rightChild(int);
int main()
{
    int limit,add,input,j;
    printf("Enter the number of elements you want to enter");
    scanf("%d",&limit);
    for (int i=0;i<limit;i++)
    {
        printf("1st edge connected");
        scanf("%d",&ptr.edge_1st);
        printf("2nd edge connected");
        scanf("%d",&ptr.edge_2nd);
        printf("Weight of the edge");
        scanf("%d",&input);
        insert(input);
    }
    while(j<=size)
    {
        if ((counter[ptr.edge_1st]||counter[ptr.edge_2nd])!=1)
        {
            add=extract();
            printf("%d",add);
            cost+=add;
            counter[ptr.edge_1st]=counter[ptr.edge_2nd]=1;
        }
        j++;
    }
    printf("The total cost incurred after adding the weights is %d",cost);
}
int insert(int input)
{
    size+=1;
    ptr.arr[size]=input;
    shiftUp(size);
    printf("Added %d to the priority queue",input);
    return 0;
}
int shiftUp(int i)
{
    int temporary;
    while(i>0 && ptr.arr[parent(i)]>ptr.arr[i])
    {
        temporary=ptr.arr[parent(i)];
        ptr.arr[parent(i)]=ptr.arr[i];
        ptr.arr[i]=temporary;
        i=parent(i);
        }   
}
int parent(int i)
{
    return(i-1)/2;
}
int leftChild(int i)
{
    return ((2*i)+1);
}
int rightChild(int i)
{
    return ((2*i)+2);
}
int extract()
{
    int result=ptr.arr[0];
    printf("The topmost element in the priority queue at present is: %d",result);
    ptr.arr[0]=ptr.arr[size];
    shiftDown(0);
    return result;  
}
int shiftDown(int i)
{
    int temp=0;
    int minIndex=i;
    int left=leftChild(i);
    if(left<=size && ptr.arr[left]<ptr.arr[minIndex])
    {
        minIndex=left;
    }
    int right=rightChild(i);
    if (right <= size && ptr.arr[right] < ptr.arr[minIndex]) 
    {
        minIndex=right;
    }
    if (i != minIndex) 
    {
        temp=ptr.arr[i];
        ptr.arr[i]=ptr.arr[minIndex];
        ptr.arr[minIndex]=temp;
        shiftDown(minIndex);
    }
    
}

我知道这很糟糕,不符合你的标准等等,但对于我的任务,我非常需要你的帮助!提前致谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。