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);
}
}
最小生成树Prim算法
最新推荐文章于 2022-11-24 21:55:58 发布