日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Prim算法详解

發(fā)布時(shí)間:2024/4/18 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Prim算法详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Prim算法是用來(lái)尋找一個(gè)聯(lián)通圖的最小生成樹(shù)的算法,是數(shù)據(jù)結(jié)構(gòu)中一個(gè)十分經(jīng)典的算法,與他齊名的還有了克魯斯卡爾算法,將會(huì)在下一篇
中提到。
Prim算法思想(歸并頂點(diǎn)):
首先給定一個(gè)起始點(diǎn),例如我們以A為起始點(diǎn),選擇與它關(guān)聯(lián)的具有最小權(quán)值的邊,將其加入到生成樹(shù)的集合頂點(diǎn)U中去(這里我們用visited[i] = true 來(lái)實(shí)現(xiàn));
然后我們進(jìn)行N - 1次循環(huán)從U中 及 非U中選擇兩個(gè)聯(lián)通的且具有最小權(quán)值的頂點(diǎn),把非U的頂點(diǎn)加入U(xiǎn)中,直到所有頂點(diǎn)都加入到U中為止。
實(shí)例圖:

這個(gè)圖較為清晰直觀的分析了Prim算法的思想。
代碼如下:
1.數(shù)據(jù)及結(jié)構(gòu)的定義:

#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <algorithm>#define N 100 #define INITFITE 1000000 using namespace std;struct Node{char data;int lowcost; }closedge[N];typedef struct NNode{int vernum,arcnum;//頂點(diǎn)數(shù),邊數(shù);char ver[N];int martrix[N][N]; }Graph;int locate (Graph G,char ch) //找到對(duì)應(yīng)字符的下標(biāo); {int i;for (i = 0;i < G.vernum;i++){if (G.ver[i] == ch)return i;} }

2.建立鄰接矩陣:

void create_Graph (Graph &G) {char v1,v2;int weight; //權(quán)值;cout<<"please key in the vernum & arcnum"<<endl;cin>>G.vernum>>G.arcnum;cout<<"please key in all the vertexs"<<endl;for (int i = 0;i < G.vernum;i++)cin>>G.ver[i];cout<<"please key in the v1 & v2 & weight"<<endl;for (int ii = 0; ii < G.vernum;ii++)for (int jj = 0; jj < G.vernum;jj++)G.martrix[ii][jj] = INITFITE; //初始化矩陣的時(shí)候?qū)⒕仃嚨闹蒂x成無(wú)窮大。for (int ii = 0;ii < G.arcnum;ii++){cin>>v1>>v2>>weight;int i = locate(G,v1);int j = locate(G,v2);//cout<<i<<" "<<j<<endl;G.martrix[i][j] = weight;G.martrix[j][i] = weight;} }

3.Prim算法:

bool visited[N];void Prim(Graph &G,char ch) {int v,w;v = locate(G,ch);visited[v] = true;int min = 1000000;for (int i = 0;i < G.vernum;i++)//為第一個(gè)頂點(diǎn)找到鄰接點(diǎn){if (!visited[i]) { closedge[i].data = G.ver[v]; //將第i的點(diǎn)的上一個(gè)鄰接點(diǎn)暫時(shí)賦成G.ver[v];closedge[i].lowcost = G.martrix[v][i];if (closedge[i].lowcost < min) //判斷并找到最小的權(quán)值{min = closedge[i].lowcost;w = i; //記錄最小權(quán)值的下標(biāo)}}}cout<<closedge[w].data<<" "<<G.ver[w]<<" "<<closedge[v].lowcost; //輸出!!cout<<endl;//visited[w] = true;for (int i = 0;i < G.vernum - 2;i++)//n-1次循環(huán)找到剩余的n-1個(gè)點(diǎn){visited[w] = true;//將G.ver[w]加入U(xiǎn);v = w;min = 1000000;for (int j = 0;j < G.vernum;j++){if (!visited[j]){if (G.martrix[v][j] < closedge[j].lowcost) //關(guān)鍵(核心思想):看G.ver[w]的引入是否改變了到達(dá)其他頂點(diǎn)的最小值,如果改變了就從新賦值,否則不變。{closedge[j].data = G.ver[v];closedge[j].lowcost = G.martrix[v][j];}if (closedge[j].lowcost < min){min = closedge[j].lowcost;w = j;}} }cout<<closedge[w].data<<" "<<G.ver[w]<<" "<<closedge[v].lowcost;cout<<endl; } }

4.主函數(shù)

int main(){Graph G;create_Graph(G);for (int i = 0; i < G.vernum;i++){for (int j = 0; j < G.vernum;j++)printf("%8d",G.martrix[i][j]);cout<<endl;}Prim(G,'A');return 0; }

Prim 算法在考研中占有相當(dāng)大的比重,要求熟練掌握編碼!!

總結(jié)

以上是生活随笔為你收集整理的Prim算法详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。