最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Prim(普里姆)算法求最小生成樹的思想及C語言實例講解

 更新時間:2016年06月26日 16:07:47   作者:_陌上花開7_  
Prim算法能夠在帶權的圖中搜索出最小生成樹,這也是各大ACM和面試及考研題目中的熱點,下面我們就來詳細看一下Prim(普里姆)算法求最小生成樹的思想及C語言實例講解

Prim 算法思想:
從任意一頂點 v0 開始選擇其最近頂點 v1 構成樹 T1,再連接與 T1 最近頂點 v2 構成樹 T2, 如此重復直到所有頂點均在所構成樹中為止。
最小生成樹(MST):權值最小的生成樹。
生成樹和最小生成樹的應用:要連通n個城市需要n-1條邊線路??梢园堰吷系臋嘀到忉尀榫€路的造價。則最小生成樹表示使其造價最小的生成樹。
構造網(wǎng)的最小生成樹必須解決下面兩個問題:
1、盡可能選取權值小的邊,但不能構成回路;
2、選取n-1條恰當?shù)倪呉赃B通n個頂點;
MST性質:假設G=(V,E)是一個連通網(wǎng),U是頂點V的一個非空子集。若(u,v)是一條具有最小權值的邊,其中u∈U,v∈V-U,則必存在一棵包含邊(u,v)的最小生成樹。
prim算法假設G=(V,E)是連通的,TE是G上最小生成樹中邊的集合。算法從U={u0}(u0∈V)、TE={}開始。重復執(zhí)行下列操作:
在所有u∈U,v∈V-U的邊(u,v)∈E中找一條權值最小的邊(u0,v0)并入集合TE中,同時v0并入U,直到V=U為止。
此時,TE中必有n-1條邊,T=(V,TE)為G的最小生成樹。
 Prim算法的核心:始終保持TE中的邊集構成一棵生成樹。
注意:prim算法適合稠密圖,其時間復雜度為O(n^2),其時間復雜度與邊得數(shù)目無關,而kruskal算法的時間復雜度為O(eloge)跟邊的數(shù)目有關,適合稀疏圖。
舉個簡單的例子來說明具體的實現(xiàn)方法:

2016626160439131.jpg (361×256)

G:圖,用鄰接矩陣表示
vcount:表示圖的頂點個數(shù)
max_vertexes:圖最大節(jié)點數(shù)
infinity:為無窮大
數(shù)組存儲從0開始
由于最小生成樹包含每個頂點,那么頂點的選中與否就可以直接用一個數(shù)組來標記used[max_vertexes];(我們這里直接使用程序代碼中的變量定義,這樣也易于理解);當選中一個數(shù)組的時候那么就標記,現(xiàn)在就有一個問題,怎么來選擇最小權值邊,注意這里最小權值邊是有限制的,邊的一個頂點一定在已選頂點中,另一個頂點當然就是在未選頂點集合中了。我最初的一個想法就是窮搜了,就是在一個集合中選擇一個頂點,來查找到另一個集合中的最小值,這樣雖然很易于理解,但是很明顯效率不是很高,在嚴蔚敏的《數(shù)據(jù)結構》上提供了一種比較好的方法來解決:設置兩個輔助數(shù)組lowcost[max_vertexes]和closeset[max_vertexes],lowcost[max_vertexes]數(shù)組記錄從U到V-U具有最小代價的邊。對于每個頂點v∈V-U,closedge[v], closeset[max_vertexes]記錄了該邊依附的在U中的頂點。

Prim 算法步驟:
T0 存放生成樹的邊,初值為空
輸入加權圖的帶權鄰接矩陣 C = (Cij)n×n (兩點間無邊相連則其大小為無窮)
為每個頂點 v 添加一屬性 L(v) :表 v 到 T0 的最小直接距離
(1) T0←∅, V1={v0}, C(T0)=0
(2) 對任意v ∈ V,L(v)←C(v, v0)
(3) If V==V1 then stop else goto next.
(4) 在 V-V1 中找點 u 使 L(u) =min{ L(v) | v ∈ (V − V1 )},記 V1 中與 u 相鄰點為 w.
(5) T0←T0∪{(u, w)}, C(T0) ←C(T0)+C(u, w), V1←V1∪{u}
(6) 對任意v ∈ (V − V1 ) if C(v, u)<L(v) then L(v) = C(v, u) else L(v)不變。
(7) Go to 3.

C++實現(xiàn)示例
prim.txt中的內容:

1 2 6
1 3 1
1 4 5
2 3 5
2 5 3
3 4 5
3 5 6
3 6 4
5 6 6
4 6 2

 
程序代碼:

#include<stdo.h>
#include<string.h>
#include <stdlib.h>
 
#define infinity 1000000 //  定義兩個不直接相鄰一步到達頂點的距離 
#define max_vertexes 6 //  定義圖形中頂點的個數(shù)
 
typedef int Graph[max_vertexes][max_vertexes];// 邊上的權值
 
void prim(Graph G,int vcount,int father[])
{  
  int i,j,k;
  int lowcost[max_vertexes];//最小代價邊上的權值
  int closeset[max_vertexes],used[max_vertexes];//依附在U中的頂點;標記是否已被選中
  int min;
  int result=0;//記錄最短距離權值的和
 
 
  for (i=0;i<vcoun;k++)  //初始化所有數(shù)組,把最短距離初始化為其他頂點到1結點的距離
  {
      lowcost[i]=G[0][i]; 
      closeset[i]=0;   
   used[i]=0;  
   father[i]=-1;   
  }  
  used[0]=1;
 
 
  
  for (i=1;i<=vcount-1;i++)   
  {   
   j=0;
    min = infinity;
      
   for (k=1;k<count;k++) //for循環(huán)得到離結點最近的頂點j
   if ((!used[k])&&(lowcost[k]
   {
    min = lowcost[k];
    j=k;
   }
   father[j]=closeset[j]; 
   printf("%d %d\n",j+1,father[j]+1);//輸出當前找到的結點,該頂點依附的上一個結點
   result=result+G[j][closeset[j]];
   used[j]=1;;//把第j個頂點并入了U中  
   for (k=1;k
        
   if (!used[k]&&(G[j][k]保留到k的最短路徑
 
    {
      lowcost[k]=G[j][k];   
      closeset[k]=j;
    }   
  }
  printf("%d",result);
}
        
int main()
{
  FILE *fr;
  int i,j,weight;
  Graph G;
  int fatheer[max_vertexes];
  for(i=0; i<max_vertexes;i++)
  for(j=0; j<max_vertexer;i++)
  G[i][j] = infinity;
  fr = fopen("prim.txt","r");
  if(!fr)
  {
   printf("fopen failed\n");
   exit(1);
  }
  while(fscanf(fr,"%d%d%d", &i, &j, &weight) != EOF)
  {
   G[i-1][j-1] = weight;
   G[j-1][i-1] = weight;
  }
 
  prim(G,max_vertexes,fatheer);
  return 0;
 
}

測試的結果如下:
2016626160558508.jpg (490×297)

相關文章

  • C++實現(xiàn)ping程序實例

    C++實現(xiàn)ping程序實例

    這篇文章主要介紹了C++實現(xiàn)ping程序實例,涉及C++對于ICMP數(shù)據(jù)包的發(fā)送與回顯處理,具有一定的實用價值,需要的朋友可以參考下
    2014-10-10
  • c++標準輸入輸出流關系的前世今生

    c++標準輸入輸出流關系的前世今生

    這篇文章主要給大家介紹了關于c++標準輸入輸出流關系的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • C語言中基礎小問題詳細介紹

    C語言中基礎小問題詳細介紹

    這篇文章詳細介紹了C語言中基礎小問題,有需要的朋友可以參考一下
    2013-10-10
  • C語言實現(xiàn)猜數(shù)字大小的游戲

    C語言實現(xiàn)猜數(shù)字大小的游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)猜數(shù)字大小的游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • C語言表達式求值中類型轉換和優(yōu)先級等問題詳解

    C語言表達式求值中類型轉換和優(yōu)先級等問題詳解

    表達式求值是一個常見的問題,可以用C語言實現(xiàn),下面這篇文章主要給大家介紹了關于C語言表達式求值中類型轉換和優(yōu)先級等問題的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-05-05
  • 淺談C++繼承中的名字查找

    淺談C++繼承中的名字查找

    下面小編就為大家?guī)硪黄獪\談C++繼承中的名字查找。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • C++中 Sort函數(shù)詳細解析

    C++中 Sort函數(shù)詳細解析

    這篇文章主要介紹了C++中 Sort函數(shù)詳細解析,sort函數(shù)是algorithm庫下的一個函數(shù),sort函數(shù)是不穩(wěn)定的,即大小相同的元素在排序后相對順序可能發(fā)生改變
    2022-08-08
  • 基于Qt實現(xiàn)C/C++調用Matlab函數(shù)全過程

    基于Qt實現(xiàn)C/C++調用Matlab函數(shù)全過程

    這篇文章給大家詳細介紹了基于Qt平臺實現(xiàn)C/C++調用Matlab函數(shù)全流程,文中通過圖文和代碼示例給大家講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • Qt如何實現(xiàn)輸入框@聯(lián)系人的@檢測的示例

    Qt如何實現(xiàn)輸入框@聯(lián)系人的@檢測的示例

    本文主要介紹了Qt如何實現(xiàn)輸入框@聯(lián)系人的@檢測的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • 關于UDP服務器客戶端編程流程介紹

    關于UDP服務器客戶端編程流程介紹

    大家好,本篇文章主要講的是關于UDP服務器客戶端編程流程介紹,感興趣的同學趕快來看看吧,對你有幫助的話記得收藏
    2021-12-12

最新評論

秀山| 抚州市| 噶尔县| 大渡口区| 德庆县| 福州市| 南召县| 全椒县| 邹平县| 色达县| 沈阳市| 辽宁省| 阳新县| 大洼县| 湖口县| 都江堰市| 丰宁| 通州市| 马龙县| 云南省| 精河县| 加查县| 丰原市| 通化县| 广平县| 汝南县| 伊金霍洛旗| 枞阳县| 信丰县| 二手房| 西峡县| 朝阳区| 泰兴市| 深州市| 会东县| 克什克腾旗| 墨竹工卡县| 尼勒克县| 大埔区| 义马市| 新和县|