滿足貪心演算法的條件是都滿足動態規劃的,只是貪心演算法的條件更強,不僅前乙個步驟的解可以用到後一步,而且前一步的解是子問題的最優解,最後能夠得到全域性的最優解。
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演算法要解決的主要問題是路徑的最短問題。假設平面上有很多點,各個點之間有很多的線連線起來,並且到達各個點的距離不相同,需要求出一條路徑,使得各個點都能被連線起來,並且他們的距離...