堆(啊哈!算法)
1.最小生成树
#include<iostream> using namespace std; int h[101]; int n; void swap(int a,int b){ int t; t=h[a]; h[a]=h[b]; h[b]=t; } void siftdown(int i){ int t,flag=0; while(i*2<=n && flag == 0){ if(h[i]>h[i*2]){ t=i*2; }else{ t=i; } if(i*2+1<=n){ if(h[t] > h[i*2+1]){ t=i*2+1; } } if(t !=i){ swap(t,i); i=t; }else{ flag=1; } } } void siftup(int i){ int flag=0; if(i==1){ return; } while(i!=1 && flag==0){ if(h[i] <h[i/2]){ swap(i,i/2); }else{ flag=1; } i=i/2; } } void build(){ for(int i=n/2;i>=1;i--){ siftdown(i); } } int deletemax(){ int t=0; t=h[1]; h[1]=h[n]; n--; siftdown(1); return t; } int main(){ int i,num; cin>>num; n=num; for(int i=1;i<=num;i++){ cin>>h[i]; } build(); for(i=1;i<=num;i++){ if(i!=num){ cout<<deletemax()<<' '; }else{ cout<<deletemax()<<endl; } } return 0; }
2.最大生成树
#include<iostream> using namespace std; int h[101],n; void swap(int a,int b){ int t; t=h[a]; h[a]=h[b]; h[b]=t; } void shiftdown(int i){ int t,flag=0; while(i*2<=n && flag == 0){ if(h[i] < h[i*2]){ t=i*2; }else{ t=i; } if(i*2+1<=n){ if(h[t]<h[i*2+1]){ t=i*2+1; } } if(i!=t){ swap(t,i); i=t; }else{ flag=1; } } } void creat(){ int i; for(i=n/2;i>=1;i--){ shiftdown(i); } } void heapsort(){ while(n>1){ swap(1,n); n--; shiftdown(1); } } int main(){ int i,num; cin>>num; for(int i=1;i<=num;i++){ cin>>h[i]; } n=num; creat(); heapsort(); for(int i=1;i<=num;i++){ if(i!=num){ cout<<h[i]<<' '; }else{ cout<<h[i]<<endl; } } return 0; }
以上2种都是优先队列