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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

图论 —— 生成树 —— 最小生成树 —— Prim

發布時間:2025/3/17 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图论 —— 生成树 —— 最小生成树 —— Prim 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【基本思想】

Prim 算法基本思想是藍白點思想,用白點代表已進入最小生成樹的點,藍點代表未進入最小生成樹的點。

每次循環都將一個藍點 u 變為白點,并且此藍點 u 與白點相連的最小邊權 min[u] 還是當前所有藍點中最小的。這相當于每次循環讓一個新的點加入生成樹,讓一條最小邊加入生成樹,n-1 次循環就能生成一棵含有 n 個點的樹,最后得到的一定是最小生成樹。

其時間復雜度為:O(N*N),N 代表點數。

【算法分析】

以下圖為例,藍點和虛線代表未進入最小生成樹的點、邊,白點和實現代表已進入最小生成樹是點、邊。

初始時,所有點都是藍點,min[1]=0,min[2、3、4、5]=INF,權值和 MST=0。

第一次循環找到 min[1]=0 最小的藍點 1。將 1 變為白點,接著枚舉與 1 相連的所有藍點 2、3、4,修改它們與白點相連的最小邊權。故有:min[2]=w[1][2]=2,min[3]=w[1][3]=4,min[4]=w[1][4]=7,MST=0。

第二次循環是找到 min[2] 最小的藍點 2。將?2 變為白點,接著枚舉與 2 相連的所有藍點 3、5,修改它們與白點相連的最小邊權。故有:min[3]=w[2][3]=1,min[5]=w[2][5]=2,MST=2。

第三次循環是找到 min[3] 最小的藍點 3。將 3 變為藍點,接著枚舉與 3 相鄰的所有藍點 4、5,修改它們與白點相連的最小邊權。故有:min[4]=w[3][4]=1,由于 min[5]=2<w[3][5]=6,所以不修改 min[5] 的值,MST=3。

最后兩輪循環將點 4、5 以及邊 w[2][5]、w[3][4] 添加進最小生成樹。

最后權值之和 MST=6。

【算法描述】

以 1 為起點生成最小生成樹,vis[v] 代表 v 點是否加入最小生成樹中,min[v] 代表藍點 v 與白點相連的最小邊權,MST 代表最小生成樹邊權之和。

初始化:

vis[1...n]=false,MST=0

min[v]=INF(v≠1),min[1]=0

主體

void Prim() {for(int i=1;i<=n;i++){int u=0;for(int j=1;j<=n;j++)//枚舉所有點if( vis[j]==false && min[j]<min[u])//尋找與白點相連的權值最小的藍點uu=j;vis[u]=true;//藍點u加入生成樹,標記為白點for(int j=1;j<=n;j++)//修改所有與u相連的藍點if( vis[j]==false && g[u][j]<min[j] )min[j]=g[u][j];}//權值和的計算int MST=0;for(int i=1;i<=n;i++)MST+=min[i]; }

【模版】

int n,m;//n個點m條邊 int G[N][N]; int dis[N]; bool vis[N]; int MST; void Prim(){for(int i=1;i<=n;i++){int k;int minn=INF;for(int j=1;j<=n;j++){//枚舉所有點if(!vis[j]&&dis[j]<minn){//尋找與白點相連的權值最小的藍點uminn=dis[j];k=j;}}vis[k]=true;//藍點u加入生成樹,標記為白點for(int j=1;j<=n;j++)//修改所有與u相連的藍點if(!vis[j]&&dis[j]>G[k][j])dis[j]=G[k][j];}MST=0;for(int i=1;i<=n;i++)//權值和的計算MST+=dis[i]; }int main(){cin>>n>>m;memset(vis,false,sizeof(vis));for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)cin>>G[i][j];for(int i=1;i<=n;i++)dis[i]=G[1][i];Prim();cout<<MST<<endl;return 0; }

總結

以上是生活随笔為你收集整理的图论 —— 生成树 —— 最小生成树 —— Prim的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。