對prim演算法有了新的理解,現在此總結一下。我們現在主要講的是實現部分。
我們的原點是0,那麼現在u集合中只有0,v-u中和0相鄰接的頂點中,最小輕邊是0和2之間的那條,所以選擇2,現在u為0和2,之後我們繼續尋找,通過窮舉法我們找到了5,然後找到了3,然後找到了1,然後找到了4,最後程式結束。
按照人的思維很簡單,但是按照計算機的思維該去如何設計這個程式呢?下面我簡單介紹一下陳惠南編著的演算法設計教材中的實現方法:
首先介紹一下頂點的資料結構,如下:
template
struct enode
看主要演算法:
template
void prim(int k,int* nearest,t* lowcost)
bool * mark = new bool[n];
enode* p;
if(k<0||k>n-1) throw outofbounds;
for(int i=0;inearest[i] = -1;mark[i] = false;
lowcost[i] = infty;
lowcost[k] = 0;nearest[k]=k;mark[k]=true;
for(i=1;i每迴圈一次加入乙個頂點,所以這裡要迴圈n-1次
for(p=a[k];p;p=p->nextarc)
t min=infty;
for(int j=0;j//從已經算出的權值中取出最小的權值,並且將相應的點加入u集合中來
if(!mark[j]&&lowcost[j]min=lowcost[j];
k=j;
mark[k] = true;
好,那麼現在來看一下按照我們設計的程式上面的過程是怎麼走的:
首先是和0相鄰接的頂點的權都被加入陣列,標號分別是123,權值分別是615,然後通過遍歷找到最小的權值1,所以標號為2 的節點被加入陣列中來。並且標號為2的節點的mark被設定為true,k值被設定為2,第一次迴圈結束
第二次迴圈所做的過程是一樣的,1345,5754權值被加入陣列,這其中還進行了比較和修改,如節點1這個時候由於和2節點的權值被計算出來,所以6權值被捨棄,取較小的權值為lowcost。然後選取輕邊,k被設定為5,第二次迴圈結束
第三次迴圈便是對3的操作,過程一樣,k被設定為3
第四次迴圈便是體現該演算法出彩的地方了。這個時候和3節點相鄰接的頂點的權都被計算出來了,而且也都mark 了,所以這個時候第二步的過程被省略了。第三步直接選取以前計算出來的權的最小值,所以節點1被加入。
最後節點4被加入,過程一樣。演算法結束
綜上,prim演算法確實生動精妙啊 啊啊啊
矩陣連乘演算法精講
今天看了好久的矩陣連乘演算法,總算有了一點頭緒,現在來細細總結一下。首先我們知道的是,矩陣連乘演算法是一種動態規劃法,那麼和多段圖和弗洛伊德演算法一樣,它也體現了動態規劃法的特點。像弗洛伊德演算法,它的動體現在每加進乙個節點,那麼d和path者兩個二維表都會發生相應的變化,且朝著全域性最優解的方向去...
貪心演算法精講
一 貪心演算法的基本概念當乙個問題具有最優子結構性質時,我們會想到用動態規劃法去解它。但有時會有更簡單有效的演算法。我們來看乙個找硬幣的例子。假設有四種硬幣,它們的面值分別為二角五分 一角 五分和一分。現在要找給某顧客六角三分錢。這時,我們會不假思索地拿出2個二角五分的硬幣,1個一角的硬幣和3個一分...
Python冒泡演算法精講《三》
data for i in range 3 控制使用者輸入三個數 class sort 定義乙個冒泡演算法的類 def sort self,data 類中定義冒泡方法 for j in range len data 1,0,1 for i in range 0,j if data i data i ...