最小生成樹Prim演算法
阿新 • • 發佈:2018-12-20
template<class T> bool Graph<T>::Prim(const T& v,PathData* E,int ne) { int s=FindNode(v); if(s==-1) { return 0; } PathData item; double cost; int id=0; for(int i=0;i<=ne;i++)//初始化邊陣列 E { if(i!=s) { item.start=s; item.dest=i; cost=GetCost(s,i); item.cost=(cost!=0?cost:MAXCOST); E[id++]=item; } } int count=0; int ns; BuildHeap(E,ne); for(int i=0;i<ne;i++)//更新入選子網 { if(E[0]<MAXCOST) count++; ns=E[0].dest; for(int j=1;j<ne-i;j++)//更新邊集 { cost=GetCost(ns,E[j].dest); cost=(cost!=0?cost:MAXCOST); if(E[j]>cost) { E[j].cost=cost; E[j].start=ns; } } item=E[0]; E[0]=E[ne-1-i]; E[ne-1-i]=item; BuildHeap(E,ne-1-i); } return (count==ne?1:0); } template<class T> void Graph<T>::PercolateDown(PathData* E,int pos,int size)//輔助BuildHeap { int p=pos,c=2*p+1; PathData temp=E[p]; while(c<size) { if(c+1<size&&E[c+1]<E[c]) { c++; } if(E[c]>temp) break; else { E[p]=E[c]; p=c; c=2*p+1; } } E[p]=temp; } template<class T> void Graph<T>::BuildHeap(PathData* E,int size)//將E調成小根堆 { for(int i=size/2-1;i>=0;i--) { PercolateDown(E,i,size); } }