中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java怎么實現最小生成樹MST

發布時間:2021-12-08 13:59:10 來源:億速云 閱讀:232 作者:iii 欄目:大數據

本篇內容介紹了“Java怎么實現最小生成樹MST”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

簡單講解

圖的定義時 我們規定一個連通圖的生成樹是一個極小連通子圖 含有N個頂點N-1個邊   我們把圖中帶權的邊  最小代價生成的樹成為最小生成樹。   

普里姆(Prim)算法  prim算法適合稠密圖,其時間復雜度為O(n^2),其時間復雜度與邊得數目無關以頂點找頂點 考慮權值 

            存儲方式為鄰接矩陣

基本思想:假設G=(V,E)是連通的,TE是G上最小生成樹中邊的集合。算法從U={u0}(u0∈V)、TE={}開始。重復執行下列操作:

   在所有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),其時間復雜度與邊得數目無關,

為了更好理解我們在這里舉一個例子,示例如下:

(1)圖中有6個頂點v1-v6,每條邊的邊權值都在圖上;在進行prim算法時,我先隨意選擇一個頂點作為起始點,當然我們一般選擇v1作為起始點,好,現在我們設U集合為當前所找到最小生成樹里面的頂點,TE集合為所找到的邊,現在狀態如下:

U={v1}; TE={};

(2)現在查找一個頂點在U集合中,另一個頂點在V-U集合中的最小權值,如下圖,在紅線相交的線上找最小值。

通過圖中我們可以看到邊v1-v3的權值最小為1,那么將v3加入到U集合,(v1,v3)加入到TE,狀態如下:

U={v1,v3}; TE={(v1,v3)};

(3)繼續尋找,現在狀態為U={v1,v3}; TE={(v1,v3)};在與紅線相交的邊上查找最小值。

我們可以找到最小的權值為(v3,v6)=4,那么我們將v6加入到U集合,并將最小邊加入到TE集合,那么加入后狀態如下:

U={v1,v3,v6}; TE={(v1,v3),(v3,v6)}; 如此循環一下直到找到所有頂點為止。

(4)下圖像我們展示了全部的查找過程:

#include<iostream>
#include<fstream>
using  namespace std;
#define MAX 100
#define MAXCOST 65535
int graph[MAX][MAX];
int Prim(int graph[][MAX], int m)//m 是點數
{
    int lowcost[m];
    int mst[m];
    int i, j, min, k, sum = 0;
    mst[1] = 0;
    lowcost[1]=0;
    for (i = 2; i <= m; i++)
    {
        lowcost[i] = graph[1][i];
        mst[i] = 1;
    }
    for (i = 2; i <= m; i++)
    {
        min = MAXCOST;
        k = 0;
        for (j = 2; j <= m; j++)
        {
            if (lowcost[j] < min && lowcost[j] != 0)
            {
                min = lowcost[j];
                k = j;//找到最小值下標
            }
        }
        cout << "V" << mst[k] << "-V" << k << "=" << min << endl;
        sum += min;
        lowcost[k] = 0;//到達k的距離為0 說明這個頂點完成了任務
        for (j = 2; j <= m; j++) // 更新lowcost 數組
        {
            if (lowcost[j] != 0 && graph[k][j] < lowcost[j])
            {
                lowcost[j] = graph[k][j];/本來到達不了 由于k的引入 可以到達了
                mst[j] = k; //這是不能總是從V1開始去別的點 把 現在能找到的近距離類似  mst[k]
            }
        }
    }
    return sum;
}
int main()
{
    int i, j, k, m, n;
    int cost;
    cout<<"please input V and E:";
    cin >> m >> n;//m=頂點的個數,n=邊的個數
    //初始化圖G
    for (i = 1; i <= m; i++)
    {
        for (j = 1; j <= m; j++)
        {
            graph[i][j] = MAXCOST;
        }
    }
    //構建圖G
    cout<<"please intput i j and cost:"<<endl;
    for (k = 1; k <= n; k++)
    {
        cin >> i >> j >> cost;
        graph[i][j] = cost;
        graph[j][i] = cost;
    }
    //求解最小生成樹
    cost = Prim(graph, m);
    //輸出最小權值和
    cout << "最小權值和=" << cost << endl;
    return 0;
}

測試數據 V E

6 10

1 2 6 

1 3 1 

1 4 5 

2 3 5 

2 5 3 

3 4 5 

3 5 6 

3 6 4 

4 6 2 

5 6 6

結果

V1-V3=1 

V3-V6=4 

V6-V4=2 

V3-V2=5 

V2-V5=3 

最小權值和=15 

請按任意鍵繼續. . .

“Java怎么實現最小生成樹MST”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沙河市| 鄂州市| 盖州市| 博湖县| 巴中市| 太和县| 无锡市| 罗甸县| 确山县| 轮台县| 潜山县| 忻城县| 疏勒县| 潢川县| 海原县| 太仓市| 黄山市| 安远县| 云梦县| 琼结县| 安顺市| 拉孜县| 玛纳斯县| 三江| 客服| 滦南县| 昔阳县| 定州市| 康保县| 周至县| 綦江县| 望奎县| 二手房| 汉寿县| 五大连池市| 韶关市| 营口市| 田林县| 明溪县| 天柱县| 阿拉善左旗|