關於prim演算法
先把有的點放於乙個集合(或者陣列)裡,這個集合裡存放的是所有走過的點。初始值為0或者false表示還沒有點
宣告乙個一維陣列用於記錄各點的權值[可理解為起始點到目標點的距離],
宣告乙個二維陣列用於記錄某點到某一點的權值,如果這兩點不可達到,則設定為無窮大
具體執行過程:
先從某一點開始,把這乙個開始的點放於宣告的乙個陣列或者集合裡,表明這一點已經被訪問過。然後再從餘下的n-1個點裡去找那個權值最小的點並記錄該點的位置然後再加上這一點的權值,同時將該點放於集合裡表明該點已初訪問。再更新權值
再看下圖,從下圖分析:
1、先選取乙個點作起始點,然後選擇它鄰近的權值最小的點(如果有多個與其相連的相同最小權值的點,隨便選取乙個)。如1作為起點。
isvisited[1]=1; //表明把1加進來說明是已經訪問過
pos=1; //記錄該位置
//用dist陣列不斷重新整理最小權值,dist[i](0dist[1]=0; //起始點i到鄰近點的最小距離為0
dist[2]=map[pos][2]=4;
dist[3]=map[pos][3]=2;
dist[4]==map[pos][4]=3;
dist[5]=map[pos][5]=maxint; //無法直達
dist[6]=map[pos][6]=maxint;
2、再在伸延的點找與它鄰近的兩者權值最小的點。
//dist以3作當前位置進行更新
isvisited[3]=1;
pos=3;
dist[1]=0; //已標記,不更新
dist[2]=map[pos][2]=4;//比5小,不更新
dist[3]=2; //已標記,不更新
dist[4]=map[pos][4]=3; //比1大,更新
dist[5]=map[pos][5]=maxint;
dist[6]=map[pos][6]=maxint;
3、最後的結果:
當所有點都連同後,結果最生成樹如上圖所示。
所有權值相加就是最小生成樹,其值為2+1+2+4+3=12。
prim演算法的實現:
//prim演算法 int prim(int n) //從1開始 isvisited[1]=true; dist[1]=max; //找到權值最小點並記錄下位置 for(i=1;imap[pos][j]) } } return sum; }
演算法的應用:
應用上面的這個模板基本上能解決一些常見的最小生成樹的演算法,例如像杭電上的acm題目:
hdoj1863:
hdoj1875:
hdoj1879:
hdoj1233:
hdoj1162:
hdoj1301:
關於這些題目在我的部落格裡都有詳細的**
hdoj1863:
hdoj1875:
hdoj1879:
hdoj1233:
hdoj1162:
hdoj1301:
最小生成樹prim演算法實現
今天從志權師兄那裡學會了最小生成樹。所謂生成樹,就是n個點之間連成n 1條邊的圖形。而最小生成樹,就是權值 兩點間直線的值 之和的最小值。首先,要用二維陣列記錄點和權值。如上圖所示無向圖 int map 7 7 map 1 2 map 2 1 4 map 1 3 map 3 1 2 然後再求最小生成...
最小生成樹prim演算法實現
最小生成樹prim演算法實現 首先,要用二維陣列記錄點和權值。如上圖所示無向圖 int map 7 7 map 1 2 map 2 1 4 map 1 3 map 3 1 2 然後再求最小生成樹。具體方法是 1.先選取乙個點作起始點,然後選擇它鄰近的權值最小的點 如果有多個與其相連的相同最小權值的點...
最小生成樹的prim演算法實現
mst minimum spanning tree,最小生成樹 問題有兩種通用的解法,prim演算法就是其中之一,它是從 點的方面 考慮構建一顆mst,大致思想是 設圖g頂點集合為u,首先任意選擇圖g中的一點作為起始點a,將該點加入集合v,再從集合u v中找到另一點b使得點b到v中任意一點的權值最小...