8.2 最小生成树的堆实现
在这里卡了很久,一直没搞明白pos数组的必要性,最后先不加pos数组写的时候终于发现是需要在边松弛之后直接shift相关终点,所以需要一个点的index导向堆index的数组。
import java.util.Scanner;
class Test{
static int size;
static int[] h=new int[10];
static int[] dis=new int[10];
static int[] pos=new int[10];
public void swap(int x,int y){
int temp;
temp=h[x];
h[x]=h[y];
h[y]=temp;
temp=pos[x];
pos[x]=pos[y];
pos[y]=temp;
}
public void shiftdown(int i){
int flag=0,min;
while(i*2<=size&&flag==0){
if(dis[h[i]]>dis[h[i*2]]) //要比较的是这些点到最小生成树的距离
min=i*2;
else
min=i;
if(i*2+1<=size){
if(dis[h[min]]>dis[h[i*2+1]])
min=i*2+1;
}
if(i==min)
flag=1;
else {
swap(i, min);
i = min;
}
}
}
public int pop(){
int t;
t=h[1];
h[1]=h[size];
size--;
shiftdown(1);
pos[h[1]]=1;
return t;
}
public void shiftup(int i){
if(i==1)
return;
int flag=0;
while(i!=1&&flag==0){
if(dis[h[i]]<dis[h[i/2]]) {
swap(i, i / 2);
}else
flag=1;
i = i / 2;
}
}
public static void main(String[] args){
Test test=new Test();
int n,m;
int[] u=new int[50];
int[] v=new int[50];
int[] w=new int[50];
int[] first=new int[10];
int[] next=new int[50];
int[] book=new int[10];
int inf=99999;
int temp,count=0,k,sum = 0;
Scanner sc=new Scanner(System.in);
System.out.println("请输入点和边的数量");