貪心演算法之Prim最小生成樹

2021-06-25 23:56:19 字數 2354 閱讀 9469

滿足貪心演算法的條件是都滿足動態規劃的,只是貪心演算法的條件更強,不僅前乙個步驟的解可以用到後一步,而且前一步的解是子問題的最優解,最後能夠得到全域性的最優解。

prim演算法是乙個求最小生成樹的演算法。表示圖g= 有鄰接表(用於稀疏矩陣)和鄰接矩陣(用於稠密矩陣)。下面我給的例項適合用稀疏矩陣。

聽了大概的演算法思想,自己使用二叉堆花了乙個下午的時間實現了。如果有錯,請大家指正。

有如下結構的圖,選出的最小生成樹如綠色路徑所示:

使用的結構也如圖

結構和輸入的**實現如下:

vectoradj[nodenum];

heap minh;

vectora;//a儲存結果

bool record[nodenum];//儲存哪些節點是已經探索過得

void conslist(int*b, int*c, int pos) //construct adjacency lists

edgetype& operator=(const edgetype& node)

};

inline bool mincmp(const int &x, const int &y)

class heap

inline void push(edgetype x)

cost[hole] = x;

} inline void heapsort()

n = m;

} inline void deletebypos(int pos) //輸入cost的索引值

else

}

cost[hole] = cost[n-1];

n--;

//return x;

}

inline void pop()//彈出操作

edgetype top()

//返回堆頂元素

inline bool empty()

//判斷堆是否為空

};

下圖展示了實現整個演算法,並且選取a為起始點的流程

bool bfind = false;//表示是否在cost中是否已經存入一條能到toindex的路徑,如果存在,並且值更小需要更新

//find, updata cost

for(int j=0;jtoindex && !bfind )}}

if(!bfind)//如果不存在,則直接加入 注:更新值的操作可以放入到堆得插入操作中去,如果找到這個值,有需要直接更新,如果沒找到,直接插入

}//get min

edgetype min = minh.top();

minh.pop();//刪除這個值

a.push_back(min);

record[min.toindex]= true;

}}下面是測試的**:從不同的from開始會得到相同的結論

void printmst()

bool bfind = false;//表示是否在cost中是否已經存入一條能到toindex的路徑,如果存在,並且值更小需要更新

//find, updata cost

for(int j=0;jtoindex && !bfind )

} }

if(!bfind)//如果不存在,則直接加入 注:更新值的操作可以放入到堆得插入操作中去,如果找到這個值,有需要直接更新,如果沒找到,直接插入

} //get min

edgetype min = minh.top();

minh.pop();//刪除這個值

a.push_back(min);

prevertex[min.toindex] = min.fromindex;

record[min.toindex]= true;

} }

void printmst()

cout << "路徑:";

while (!trace.empty()) {

cout

int to = vertex;

while(to!=-1)

{ for(int i=0;i

貪心演算法 最小生成樹 Prim演算法

乙個無向帶權圖g v,e 其中n個頂點vertex,以及連線各個頂點之間的邊edge,可能有些頂點之間沒有邊,每條邊上的權值都是非負值。生成樹 g的乙個子圖,包含了所有的vertex,和部分的edge。最小生成樹 所有的生成樹中,各條edge上的權值總和最小的乙個。例子 設計通訊網路時,各個城市之間...

貪心演算法之最小生成樹(Prim)

最小生成樹 prim 網路的生成樹中的邊帶權值,將生成樹各邊的權值加起來稱為生成樹的權,權值最小的生成樹稱為為最小生成樹。設g v,e 是連通帶權圖,v prim演算法基本思想 首先置s 然後,只要s是v的真子集,就進行如下貪心選擇 選取滿足條件i s,j v s,且c i j 最小的邊,將頂點j新...

最小生成樹之prim演算法

最小生成樹的演算法思想和介面介紹過的求單源的最短路徑演算法dijkstra演算法有很多相似地方,甚至很多 都是一樣。prim演算法要解決的主要問題是路徑的最短問題。假設平面上有很多點,各個點之間有很多的線連線起來,並且到達各個點的距離不相同,需要求出一條路徑,使得各個點都能被連線起來,並且他們的距離...