国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

算法提高-圖論- 最小生成樹(shù)

這篇具有很好參考價(jià)值的文章主要介紹了算法提高-圖論- 最小生成樹(shù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

最小生成樹(shù)

AcWing 1140. 最短網(wǎng)絡(luò)

#include <iostream>
#include <cstring>

using namespace std;

const int N = 110;

int w[N][N];
int dist[N];
bool st[N];
int n;

int prime()
{
    int res = 0;
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    //和dj一樣 這里1號(hào)節(jié)點(diǎn)雖然是最短的,但是我們需要它去更新其他邊,因此不能st[1] = true;
    for (int i = 0; i < n; i ++ )//和dj一樣,這里循環(huán)n次才能把n個(gè)節(jié)點(diǎn)加進(jìn)最小生成樹(shù)
    {
        int t = -1;
        
        for (int j = 1; j <= n; j ++ )
            if (!st[j] && (t == -1 || dist[t] > dist[j]))
                t = j;
                
        st[t] = true;
        res += dist[t];
        
        for (int j = 1; j <= n; j ++ )
        {
            dist[j] = min(dist[j], w[t][j]);//這里不用dist[t] + w[t][j],這是求一個(gè)點(diǎn)到一個(gè)集合的距離,后者是求點(diǎn)j到源點(diǎn)的距離
        }
    }
    return res;
}

int main ()
{
    cin >> n;
    for (int i = 1; i <= n; i ++ )//題目要的答案和節(jié)點(diǎn)的下標(biāo)無(wú)關(guān),這里能把它存下來(lái)就行了
        for (int j = 1; j <= n; j ++ )
            cin >> w[i][j];
    
    cout << prime();
    return 0;
}

AcWing 1141. 局域網(wǎng)

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 110, M = 210;

struct Edge
{
    int a, b, w;
    bool operator < (const Edge &t)const
    {
        return w < t.w;
    }
}e[M];

int p[N];//并查集父類數(shù)組
int n, m;

int find(int x)
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];//return x 也是一樣的
}
int main ()
{
    cin >> n >> m;
    
    for (int i = 1; i <= n; i ++ ) p[i] = i;//并查集初始化(這個(gè)經(jīng)常忘),這個(gè)下標(biāo)i是有意義的,要根據(jù)題目給的節(jié)點(diǎn)編號(hào)來(lái)
    
    for (int i = 0; i < m; i ++ )
    {
        int a, b, w;
        cin >> a >> b >> w;
        //e[i].a = a, e[i].b = b, e[i].w = w;
        e[i] = {a, b, w};
    }
    
    sort(e, e + m);
    int res = 0;
    for (int i = 0; i < m; i ++ )
    {
        int a = find(e[i].a), b = find(e[i].b), w = e[i].w;//后面不用再find了,因?yàn)槲覀僡,b在定義的時(shí)候就是他們所屬的集合
    
        if(a != b) p[a] = b;
        else res += w;
    }
    
    cout << res;
    return 0;
}

AcWing 1142. 繁忙的都市

和上題一摸一樣,但是題意要求的out看起來(lái)需要特別處理,其實(shí)只要想清楚kruskal的性質(zhì)就好

//kruskal本身就具有選擇的路的權(quán)值中最大的權(quán)值盡量小這個(gè)性質(zhì),因?yàn)槲覀冞吺桥判蛄说?/span>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 310, M = 8010;

struct Edge
{
    int a, b, w;
    bool operator < (struct Edge &t)
    {
        return w < t.w;
    }
}e[M];

int n, m;
int p[N];

int find (int x)
{
    if (p[x] != x) p[x] = find (p[x]);
    return p[x];
}

int main ()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ ) p[i] = i;
    
    for (int i = 0; i < m; i ++ )
    {
        int a, b, w;
        cin >> a >> b >> w;
        e[i] = {a, b, w};
    }
    
    sort(e, e + m);
    int cnt = 0, res = 0;
    for (int i = 0; i < m; i ++ )
    {
        int a = find(e[i].a), b = find(e[i].b), w = e[i].w;
        
        if (a != b) 
        {
            p[a] = b;
            cnt ++ ;
            res = w;
        }
    }
    
    cout << cnt << " " << res ;
    return 0;
}

AcWing 1143. 聯(lián)絡(luò)員

//1.用到了縮點(diǎn),但本題的是無(wú)形中的,一個(gè)聯(lián)通塊的縮成了它的父節(jié)點(diǎn)
//2.知道了kurskal有多牛,可以解決已經(jīng)有一些邊的最小生成樹(shù)問(wèn)題,也可以解決只找一部分邊的最小生成樹(shù)的問(wèn)題
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 2010, M = 10010;

struct Edge
{
    int a, b, w;
    bool operator < (struct Edge & t)
    {
        return w < t.w;
    }
}e[M];

int p[N];
int n, m;

int find (int x)
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}
int main ()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ ) p[i] = i;
    
    int res = 0, k = 0;
    
    for (int i = 0; i < m; i ++ ) 
    {
        int t, a, b, w;
        cin >> t >> a >> b >> w;
        if (t == 1)
        {
            p[find(a)] = find(b);//先建立必須要選擇的邊
            res += w;
        }
        else 
        {
            e[k ++ ] = {a, b, w};//不是必須要選擇的再加入e數(shù)組
        }
    }
    
    sort(e, e + k);
    for (int i = 0; i < k; i ++ )
    {
        int a = find(e[i].a), b = find(e[i].b), w = e[i].w;
        if (a != b)
        {
            p[a] = b;
            res += w;
        }
    }
    cout << res;
    return 0;
}

AcWing 1144. 連接格點(diǎn)

題意就是求最小生成樹(shù),因?yàn)檫厵?quán)都是正數(shù),那么我們多選一條邊必然會(huì)導(dǎo)致我們的代價(jià)增大
但如果題目說(shuō)了邊權(quán)為正或者負(fù)數(shù),那么就不是最小生成樹(shù)了,極端一點(diǎn)所有邊都是負(fù)的,那么我們?yōu)榱舜鷥r(jià)最小肯定是所有邊都選文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-596764.html

//有點(diǎn)類似于拯救大兵那題
#include <iostream>
#include <cstring>

using namespace std;

const int N = 1e3 + 10, M = N * N, K = 2 * N * N;//M:點(diǎn)數(shù), K = 邊數(shù)

struct  Edge
{
    int a, b, w;
}e[K];
int p[M];
int ids[N][N], cnt;//將二維坐標(biāo)映射成1維
int n, m, k;

int find(int x)
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

void get_edges()
{
    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, -1, 0, 1}, dw[4] = {1, 2, 1, 2};//必須要按1212的順序枚舉,這樣u%2的時(shí)候就可以先添加1的邊再添加2的邊,自己排序少一個(gè)快排logn的復(fù)雜度
    for (int z = 0; z < 2; z ++ )//先枚舉u%2余數(shù)為0的再枚舉u%2余數(shù)為1的,余數(shù)為0說(shuō)明是豎邊權(quán)值為1,為1說(shuō)明是橫邊權(quán)值為2
        for (int i = 1; i <= n; i ++ )
            for (int j = 1; j <= m; j ++ )
                for (int u = 0; u < 4; u ++ )
                {
                    if (u % 2 == z)
                    {
                        int x = i + dx[u], y = j + dy[u], w = dw[u];
                        int a = ids[i][j], b = ids[x][y];
                        if (a < b) e[k ++ ] = {a, b, w};//因?yàn)槭菬o(wú)向邊我們枚舉一個(gè)就行了
                    }
                }
}
int main()
{
    cin >> n >> m;
    
    for (int i = 1; i <= n * m; i ++ ) p[i] = i;
    
    for (int i = 1;i <= n; i ++ )//將二維坐標(biāo)映射成1維
        for (int j = 1; j <= m; j ++ )
            ids[i][j] = ++ cnt;
    
    int x1, x2, y1, y2;
    while(cin >> x1 >> y1 >> x2 >> y2)
    {
        int a = ids[x1][y1], b = ids[x2][y2];
        p[find(a)] = find(b);
    }
    
    get_edges();//初始化e[]
    
    
    int res = 0;
    for (int i = 0; i < k; i ++ )
    {
        int a = find(e[i].a), b = find(e[i].b), w = e[i].w;
        if (a != b)
        {
            p[a] = b;
            res += w;
        }
    }
    
    cout << res;
    
    return 0;
    
}

到了這里,關(guān)于算法提高-圖論- 最小生成樹(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 圖論與算法(遍歷、最小生成樹(shù)、最短路徑)

    圖論與算法(遍歷、最小生成樹(shù)、最短路徑)

    圖是由頂點(diǎn)集合及頂點(diǎn)間的關(guān)系組成的一種數(shù)據(jù)結(jié)構(gòu):G = (V, E),其中:頂點(diǎn)集合V = {x|x屬于某個(gè)數(shù)據(jù)對(duì)象集}是有窮非空集合;E = {(x,y)|x,y屬于V}或者E = {x, y|x,y屬于V Path(x, y)}是頂點(diǎn)間關(guān)系的有窮集合,也叫做邊的集合。(x, y)表示x到y(tǒng)的一條雙向通路,即(x, y)是無(wú)方向的;Path

    2024年04月14日
    瀏覽(24)
  • 【算法每日一練]-圖論(保姆級(jí)教程篇7 最小生成樹(shù) ,并查集模板篇)#村村通 #最小生成樹(shù)

    【算法每日一練]-圖論(保姆級(jí)教程篇7 最小生成樹(shù) ,并查集模板篇)#村村通 #最小生成樹(shù)

    目錄 題目:村村通 并查集? 題目:最小生成樹(shù) kruskal算法 prim算法 ???????? 先引入問(wèn)題: 要在n個(gè)城市之間鋪設(shè)光纜,主要目標(biāo)是要使這 n 個(gè)城市的 任意兩個(gè)之間都可以通信 ,但鋪設(shè)光纜的費(fèi)用很高,且各個(gè)城市之間鋪設(shè)光纜的費(fèi)用不同,因此另一個(gè)目標(biāo)是要 使鋪設(shè)光

    2024年02月04日
    瀏覽(21)
  • 【算法基礎(chǔ):搜索與圖論】3.5 求最小生成樹(shù)算法(Prim&Kruskal)

    【算法基礎(chǔ):搜索與圖論】3.5 求最小生成樹(shù)算法(Prim&Kruskal)

    最小生成樹(shù) 有關(guān)樹(shù)的定義 生成子圖 :生成子圖是從原圖中選取部分節(jié)點(diǎn)以及這些節(jié)點(diǎn)之間的邊所組成的圖。生成子圖中的所有節(jié)點(diǎn)和邊都必須在原圖中存在。 生成樹(shù) :一個(gè)連通 無(wú)向圖 的 生成子圖 ,同時(shí)要求是樹(shù)。也即在圖的邊集中選擇 n - 1 條,將所有頂點(diǎn)連通。 我們

    2024年02月16日
    瀏覽(22)
  • 【算法入門(mén)&圖論】【模板】拓?fù)渑判騶【模板】單源最短路2 |最小生成樹(shù)

    【算法入門(mén)&圖論】【模板】拓?fù)渑判騶【模板】單源最短路2 |最小生成樹(shù)

    ?作者簡(jiǎn)介:熱愛(ài)后端語(yǔ)言的大學(xué)生,CSDN內(nèi)容合伙人 ?精品專欄:C++面向?qū)ο???系列專欄:算法百煉成神 本專欄收錄的均為??途W(wǎng)的算法題目,內(nèi)含鏈表、雙指針、遞歸、動(dòng)態(tài)規(guī)劃、基本數(shù)據(jù)結(jié)構(gòu)等算法思想的具體運(yùn)用。??途W(wǎng)不僅有大量的經(jīng)典算法題目,也有大廠的面

    2024年02月03日
    瀏覽(64)
  • 數(shù)學(xué)建模十大算法04—圖論算法(最短路徑、最小生成樹(shù)、最大流問(wèn)題、二分圖)

    數(shù)學(xué)建模十大算法04—圖論算法(最短路徑、最小生成樹(shù)、最大流問(wèn)題、二分圖)

    一、最短路徑問(wèn)題 從圖中的某個(gè)頂點(diǎn)出發(fā),到達(dá)另一個(gè)頂點(diǎn)的 所經(jīng)過(guò)的邊的權(quán)重之和最小 的一條路徑。 1.1 兩個(gè)指定頂點(diǎn)之間的最短路徑 問(wèn)題如下:給出了一個(gè)連接若干個(gè)城鎮(zhèn)的鐵路網(wǎng)絡(luò),在這個(gè)網(wǎng)絡(luò)的兩個(gè)指定城鎮(zhèn)間,求一條最短鐵路線。 1.1.1 Dijkstra算法 迪杰斯特拉(D

    2024年02月02日
    瀏覽(82)
  • 【算法導(dǎo)論】圖論(圖的基本概念,圖上的深度優(yōu)先搜索(DFS),廣度優(yōu)先搜索(BFS),最小生成樹(shù)(MST)及Prim,Kruskal算法)

    【算法導(dǎo)論】圖論(圖的基本概念,圖上的深度優(yōu)先搜索(DFS),廣度優(yōu)先搜索(BFS),最小生成樹(shù)(MST)及Prim,Kruskal算法)

    圖(Graph)是一種包含節(jié)點(diǎn)與節(jié)點(diǎn)的邊的集合,記作G=(V,E),V是節(jié)點(diǎn)的集合,E是邊的集合。 有向圖 一個(gè)有向圖G=(V,E),E中每個(gè)元素是V上的一個(gè)二值關(guān)系:一條從a出發(fā)的連向b的邊e可以記作一個(gè) 有序 對(duì)e = (a,b) 。 無(wú)向圖 一個(gè)無(wú)向圖G=(V,E),E的每個(gè)元素e可以表示V上的一個(gè) 無(wú)序 對(duì),記

    2024年02月03日
    瀏覽(28)
  • 圖論- 最小生成樹(shù)

    圖論- 最小生成樹(shù)

    一幅圖可以有很多不同的生成樹(shù),比如下面這幅圖,紅色的邊就組成了兩棵不同的生成樹(shù): 對(duì)于加權(quán)圖, 每條邊都有權(quán)重(用最小生成樹(shù)算法的現(xiàn)實(shí)場(chǎng)景中,圖的邊權(quán)重一般代表成本、距離這樣的標(biāo)量),所以每棵生成樹(shù)都有一個(gè)權(quán)重和。 比如上圖,右側(cè)生成樹(shù)的權(quán)重和顯

    2024年04月25日
    瀏覽(17)
  • 圖論——最小生成樹(shù)

    圖論——最小生成樹(shù)

    想了解最小生成樹(shù),首先得明白什么是生成樹(shù)。 生成樹(shù)的概念: 包含連通圖中所有的頂點(diǎn),且任意兩頂點(diǎn)之間有且僅有一條通路。 那什么是最小生成樹(shù)? 最小生成樹(shù)(Minimum Spanning Trees)的概念:連通圖的一顆生成樹(shù)(Spanning Tree)是包含圖的所有頂點(diǎn)的連通無(wú)環(huán)子圖(也就是一棵

    2023年04月13日
    瀏覽(17)
  • 【圖論】最小生成樹(shù)的應(yīng)用

    P1550 [USACO08OCT] Watering Hole G - 洛谷 | 計(jì)算機(jī)科學(xué)教育新生態(tài) (luogu.com.cn) 1.我們是要使所有的農(nóng)場(chǎng)都要有水 2.可以從起點(diǎn)引水,也可以互相引水。 3.費(fèi)用要最小 這時(shí)我們可以想到最小生成樹(shù),建立一個(gè)虛擬節(jié)點(diǎn)即可。思路一目了然。 當(dāng)看到這些條件,可以想到最小生成樹(shù) 1.涉及

    2024年02月10日
    瀏覽(19)
  • 【圖論】最小生成樹(shù)(python和cpp)

    【圖論】最小生成樹(shù)(python和cpp)

    本帖持續(xù)更新中 如有紕漏望指正! (a)點(diǎn)云建立的k近鄰圖 (b)k近鄰圖上建立的最小生成樹(shù) 最小生成樹(shù) (Minimum Spanning Tree,簡(jiǎn)稱 MST) 是一種在帶權(quán)無(wú)向圖中的樹(shù),它連接了圖中所有節(jié)點(diǎn)并且總權(quán)重最小。在最小生成樹(shù)中,任意兩個(gè)節(jié)點(diǎn)之間有且僅有一條路徑,同時(shí)這些路徑

    2024年02月05日
    瀏覽(13)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包