如何解决使用优先队列的 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 举报,一经查实,本站将立刻删除。