經典演算法之Prim演算法__演算法

來源:互聯網
上載者:User

此演算法為Prim演算法完整版。具體prim演算法分析請見
http://blog.csdn.net/yeruby/article/details/38615045

/************************author's email:wardseptember@gmail.comdate:2017.11************************/#include<iostream>#define INF 100//INF為比圖中任何權值都大的數#define maxSize 6using namespace std;typedef struct {//圖的定義    float edges[maxSize][maxSize];//鄰接矩陣的定義    int n, e;   //分別為頂點數和邊數}MGraph;MGraph creatGraph(MGraph g);void prim(MGraph g, int v0, float &sum);//prim演算法int main() {    MGraph g;//定義並初始化圖g    g.edges[maxSize][maxSize] = { 0 };    g.n = maxSize; g.e = 10;    g=creatGraph(g);//建立一個圖    float sum;    prim(g, 0, sum);    cout << "最小產生樹的權值為:";    cout << sum<<endl;    return 0;}MGraph creatGraph(MGraph g) {/*此圖的各個頂點為一個正無邊形的頂點,加正中間一個點。正中間一個點與各個頂點相連*/    int i, j;    for (i = 0; i < maxSize; i++)    {        for (j = 0; j < maxSize; j++)        {            g.edges[i][j] = INF;        }    }    g.edges[0][1] = 6;    g.edges[1][0] = 6;    g.edges[0][2] = 1;    g.edges[2][0] = 1;    g.edges[0][3] = 5;    g.edges[3][0] = 5;     g.edges[1][2] = 4;    g.edges[2][1] = 4;    g.edges[1][4] = 3;    g.edges[4][1] = 3;    g.edges[2][3] = 2;     g.edges[3][2] = 2;    g.edges[2][4] = 7;    g.edges[4][2] = 7;    g.edges[2][5] = 8;    g.edges[5][2] = 8;    g.edges[3][5] = 9;    g.edges[5][3] = 9;    g.edges[4][5] = 11;    g.edges[5][4] = 11;    g.n = maxSize;    g.e = 10;    return g;}void prim(MGraph g, int v0, float &sum) {    float lowcost[maxSize], vset[maxSize]; /*lowcost[maxSize]用於儲存當前產生樹到剩餘各頂點最短邊的權值,    vset[maxSize]用於判斷頂點是否併入產生樹,vset[i]=1表示併入*/    int i, j, k,v ;    float min;    v = v0;    for (i = 0; i < g.n; ++i) {//lowcost存入v0到各頂點的權值,vset初始化        lowcost[i] = g.edges[v0][i];        vset[i] = 0;    }    vset[v0] = 1;//頂點v0併入樹中    sum = 0;         for (i = 0; i < g.n - 1; ++i)//訪問剩餘的n-1個頂點。以下注釋是此迴圈第一趟的注釋,其他的類似    {        min = INF;        for(j=0;j<g.n;++j)//找到與v0相連的權值中的最小值            if (vset[j] == 0 && lowcost[j] < min)            {                min = lowcost[j];                k = j;            }        vset[k] = 1;//將頂點v併入樹        v = k;        sum = sum + min;//sum記錄最小產生樹的權值        //更新剛併入樹的頂點v到剩餘各頂點最短邊的權值,與v0相比較        for (j = 0; j < g.n; ++j)            if (vset[j] == 0 && g.edges[v][j] < lowcost[j])                lowcost[j] = g.edges[v][j];    }}

以上如有錯誤請立即指出,我立刻改正。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.