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

第三章 圖論 No.4最小生成樹的簡單應(yīng)用

這篇具有很好參考價值的文章主要介紹了第三章 圖論 No.4最小生成樹的簡單應(yīng)用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

存在邊權(quán)為負的情況下,無法求最小生成樹

第三章 圖論 No.4最小生成樹的簡單應(yīng)用,AcWing算法提高課 課程記錄,圖論

裸題:1140. 最短網(wǎng)絡(luò)

1140. 最短網(wǎng)絡(luò) - AcWing題庫
第三章 圖論 No.4最小生成樹的簡單應(yīng)用,AcWing算法提高課 課程記錄,圖論
套個prim的板子即可

#include <iostream>
#include <cstring>
using namespace std;

const int N = 110, INF = 0x3f3f3f3f;
int g[N][N];
int dis[N]; bool st[N];
int n;

int prim()
{
    memset(dis, 0x3f, sizeof(dis));
    int res = 0;
    for (int i = 0; i < n; ++ i )
    {
        int x = -1;
        for (int j = 1; j <= n; ++ j ) 
            if (!st[j] && (x == -1 || dis[x] > dis[j])) x = j;
        st[x] = true;
        if (i && dis[x] == INF) return INF;
        if (i) res += dis[x];
        
        for (int y = 1; y <= n; ++ y )
            dis[y] = min(dis[y], g[x][y]);
    }
    return res;
}

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; ++ i )
        for (int j = 1; j <= n; ++ j )
            scanf("%d", &g[i][j]);
            
    printf("%d\n", prim());
    return 0;
}

裸題:1141. 局域網(wǎng)

1141. 局域網(wǎng) - AcWing題庫
第三章 圖論 No.4最小生成樹的簡單應(yīng)用,AcWing算法提高課 課程記錄,圖論

裸題,稀疏圖,套個kruskal的板子就行
需要注意的是:題目給定的圖可能存在多個連通塊,若使用prim算法,需要對每個連通塊求最小生成樹,但是使用kruskal能直接求出所有連通塊的最小生成樹

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 110, M = 210;
struct Edge
{
    int x, y, w;
    bool operator<(const Edge& e) const 
    {
        return w < e.w;
    }
}edges[M];

int p[N];
int n, m;

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

int kruskal()
{
    sort(edges, edges + m);
    for (int i = 1; i <= n; ++ i ) p[i] = i;
    int cnt = 0, res = 0;
    for (int i = 0; i < m; ++ i )
    {
        auto t = edges[i];
        int x = edges[i].x, y = edges[i].y, w = edges[i].w;
        x = find(x), y = find(y);
        if (x != y)
        {
            cnt ++ ;
            res += w;
            p[x] = y;
        }
    }
    return res;
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++ i )
        scanf("%d%d%d", &edges[i].x, &edges[i].y, &edges[i].w);
        
    int sum = 0;
    for (int i = 0; i < m; ++ i ) sum += edges[i].w;
    printf("%d\n", sum - kruskal());
    return 0;
}

裸題:1142. 繁忙的都市

1142. 繁忙的都市 - AcWing題庫
依然是套kruskal的板子
第三章 圖論 No.4最小生成樹的簡單應(yīng)用,AcWing算法提高課 課程記錄,圖論

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 310 ,M = 8010;
struct Edge
{
    int x, y, w;
    bool operator<(const Edge& e) const
    {
        return w < e.w;
    }
}edges[M];

int n, m;
int p[N];

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

int kruskal()
{
    sort(edges, edges + m);
    int res = 0;
    for (int i = 1; i <= n; ++ i ) p[i] = i;
    for (int i = 0; i < m; ++ i )
    {
        auto t = edges[i];
        int x = t.x, y = t.y, w = t.w;
        x = find(x), y = find(y);
        if (x != y)
        {
            res = max(res, w);
            p[x] = y;
        }
    }
    return res;
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++ i )
        scanf("%d%d%d", &edges[i].x, &edges[i].y, &edges[i].w);
        
    printf("%d %d\n", n - 1, kruskal());
    return 0;
}

裸題:1143. 聯(lián)絡(luò)員

1143. 聯(lián)絡(luò)員 - AcWing題庫
第三章 圖論 No.4最小生成樹的簡單應(yīng)用,AcWing算法提高課 課程記錄,圖論

添加所有必選的邊,維護并查集,然后再對非必選的邊做kruskal


#include <iostream>
#include <algorithm>
using namespace std;

const int N = 2010, M = 10010;
struct Edge
{
    int x, y, w;
    bool operator<(const Edge& e) const 
    {
        return w < e.w;
    }
}edges[M];

int n, m, cnt;
int p[N];

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

int kruskal()
{
    int res = 0;
    for (int i = 0; i < cnt; ++ i )
    {
        auto t = edges[i];
        int x = t.x, y = t.y, w = t.w;
        x = find(x), y = find(y);
        if (x != y)
        {
            res += w;
            p[x] = y;
        }
    }
    return res;
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++ i ) p[i] = i;
    
    int t, x, y, d;
    int res = 0;
    while ( m -- )
    {
        scanf("%d%d%d%d", &t, &x, &y, &d);
        if (t == 1)
        {
            x = find(x), y = find(y);
            if (x != y) p[x] = y;
            res += d;
        }
        else
        {
            edges[cnt].x = x, edges[cnt].y = y, edges[cnt].w = d;
            cnt ++ ;
        }
    }
    sort(edges, edges + cnt);
    res += kruskal();
    printf("%d\n", res);
    
    return 0;
}

有些麻煩的裸題:1144. 連接格點

1144. 連接格點 - AcWing題庫
第三章 圖論 No.4最小生成樹的簡單應(yīng)用,AcWing算法提高課 課程記錄,圖論

點陣為圖中的點,將二維坐標(biāo)轉(zhuǎn)換成一維,作為點的編號
添加已有連線后,做kruskal即可

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1010;
struct Edge
{
    int x, y, w;
    bool operator<(const Edge& e) const 
    {
        return w < e.w;
    }
}edges[2 * N * N];

int n, m, cnt = 1;
int p[N * N];
int g[N][N]; // 二維到一維
int dx[3] = { 0, 1, 0 }, dy[3] = { 0, 0, 1 };

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

int kruskal()
{
    int res = 0;
    for (int i = 0; i < cnt; ++ i )
    {
        auto t = edges[i];
        int x = t.x, y = t.y, w = t.w;
        x = find(x), y = find(y);
        if (x != y)
        {
            res += w;
            p[x] = y;
        }
    }
    return res;
}

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++ i )
        for (int j = 1; j <= m; ++ j )
            g[i][j] = cnt ++ ;
    
    for (int i = 1; i < cnt; ++ i ) p[i] = i;
    int x1, x2, y1, y2;
    while (~scanf("%d%d%d%d", &x1, &y1, &x2, &y2))
    {
        int x = g[x1][y1], y = g[x2][y2];
        x = find(x), y = find(y);
        if (x != y) p[x] = y;
    }
    
    cnt = 0;
    for (int i = 1; i <= n; ++ i )
        for (int j = 1; j <= m; ++ j )
            for (int k = 1; k <= 2; ++ k )
            {
                int a = i + dx[k], b = j + dy[k];
                if (a >= 1 && a <= n && b >= 1 && b <= m)
                {
                    int x = g[i][j], y = g[a][b];
                    edges[cnt ++ ] = { x, y, k };
                }
                    
            }
            
    sort(edges, edges + cnt);
    printf("%d\n", kruskal());
    
    return 0;
}

debug:n * m的矩陣中,相鄰兩點之間存在一條邊,那么矩陣中的邊數(shù)應(yīng)該為m(n-1) + n(m-1),大概就是2 * n * n,數(shù)組開小了導(dǎo)致SF
盡量不要在for循環(huán)中定義除了循環(huán)變量之外的變量

第三章 圖論 No.4最小生成樹的簡單應(yīng)用,AcWing算法提高課 課程記錄,圖論
需要注意的是,200萬條邊進行排序會消耗很多時間,由于邊的權(quán)值只有1和2,所以可以先添加權(quán)值為1的邊,再添加權(quán)值為2的邊文章來源地址http://www.zghlxwxcb.cn/news/detail-628344.html

到了這里,關(guān)于第三章 圖論 No.4最小生成樹的簡單應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 第三章 圖論 No.12歐拉回路與歐拉路徑

    第三章 圖論 No.12歐拉回路與歐拉路徑

    小學(xué)一筆畫問題,每條邊只經(jīng)過一次 判斷圖是否存在歐拉回路:判斷圖是否連通(存在孤立邊),再根據(jù)有向/無向具體判斷 對于無向圖來說, 歐拉路徑 中,起點和終點的度數(shù)為奇數(shù),中間點的度數(shù)為偶數(shù) 起點和終點:開始和結(jié)束時必須經(jīng)過一條邊,其余情況為:從一條邊

    2024年02月12日
    瀏覽(23)
  • 第三章 圖論 No.10無向圖的雙連通分量

    第三章 圖論 No.10無向圖的雙連通分量

    無向圖有兩種雙連通分量 邊雙連通分量,e-DCC 點雙連通分量,v-DCC 橋:刪除這條無向邊后,圖變得不連通,這條邊被稱為橋 邊雙連通分量:極大的不含有橋的連通區(qū)域,說明無論刪除e-DCC中的哪條邊,e-DCC依舊連通 (該連通分量的任意邊屬于原圖中的某條環(huán))。此外,任意兩

    2024年02月12日
    瀏覽(15)
  • 第三章 圖論 No.1單源最短路及其綜合應(yīng)用

    第三章 圖論 No.1單源最短路及其綜合應(yīng)用

    做乘法的最短路時,若權(quán)值=0,只能用spfa來做,相等于加法中的負權(quán)邊 1129. 熱浪 1129. 熱浪 - AcWing題庫 單源最短路,稀疏圖,用堆優(yōu)化Dijkstra即可,就是板子套了個背景 debug:由于是無向圖,邊的數(shù)量要開兩倍。但是 w[N] 沒改,debug了很久 所以 e[M], ne[M], w[M] ,只有 h[N] ,其他

    2024年02月14日
    瀏覽(19)
  • 第三章 圖論 No.11二分圖,匈牙利算法與點覆蓋

    第三章 圖論 No.11二分圖,匈牙利算法與點覆蓋

    257. 關(guān)押罪犯 - AcWing題庫 最大最小問題,一眼二分 答案的范圍在 [ 1 , 1 e 9 ] [1, 1e9] [ 1 , 1 e 9 ] 之間,二分答案,check(mid) check:將所有權(quán)值大于mid的邊進行二分,若能得到二分圖,返回true,否則返回false 最終將得到最優(yōu)解ans,所有大于ans的邊組成的圖為二分圖,若是圖中有邊

    2024年02月12日
    瀏覽(19)
  • 第三章 圖論 No.8最近公共祖先lca, tarjan與次小生成樹

    第三章 圖論 No.8最近公共祖先lca, tarjan與次小生成樹

    O ( m l o g n ) O(mlogn) O ( m l o g n ) ,n為節(jié)點數(shù)量,m為詢問次數(shù),lca是一種在線處理詢問的算法 自己也是自己的祖先 倍增: f a ( i , j ) fa(i, j) f a ( i , j ) 表示從i開始,向上走 2 j 2^j 2 j 步走到的點 j = 0,走到父節(jié)點 j 0,分兩步走,先走到 2 j ? 1 2^{j-1} 2 j ? 1 步再走 2 j ? 1 2^{

    2024年02月13日
    瀏覽(26)
  • 第三章 圖論 No.6負環(huán)之01分?jǐn)?shù)規(guī)劃與特殊建圖方式

    第三章 圖論 No.6負環(huán)之01分?jǐn)?shù)規(guī)劃與特殊建圖方式

    裸題:904. 蟲洞 904. 蟲洞 - AcWing題庫 這個==真的服,調(diào)半天,還有,鄰接表的大小又設(shè)置錯了 01分?jǐn)?shù)規(guī)劃:361. 觀光奶牛 361. 觀光奶牛 - AcWing題庫 在圖論問題中,所有形如:某個部分之和除以某個部分之和最大的問題,被稱為01分?jǐn)?shù)規(guī)劃,通常使用二分解決這類問題 根據(jù)題意

    2024年02月13日
    瀏覽(19)
  • 第三章 圖論 No.9有向圖的強連通與半連通分量

    第三章 圖論 No.9有向圖的強連通與半連通分量

    連通分量是無向圖的概念,yxc說錯了,不要被誤導(dǎo) 強連通分量:在一個有向圖中,對于分量中的任意兩點u,v,一定能從u走到v,且能從v走到u。強連通分量是一些點的集合,若加入其他點,強連通分量中的任意兩點就不能互相遞達 半連通分量:在一個有向圖中,對于分量中

    2024年02月13日
    瀏覽(17)
  • 第三章 圖論 No.2單源最短路之虛擬源點,狀壓最短路與最短路次短路條數(shù)

    第三章 圖論 No.2單源最短路之虛擬源點,狀壓最短路與最短路次短路條數(shù)

    dp是特殊的最短路,是無環(huán)圖(拓撲圖)上的最短路問題 1137. 選擇最佳線路 1137. 選擇最佳線路 - AcWing題庫 對于每組測試數(shù)據(jù),該重置的數(shù)據(jù)要重置,我沒有重置idx,導(dǎo)致TLE 處理反向建圖,還有一種擴展做法:虛擬源點 設(shè)置虛擬源點,與每個起點之間連接邊權(quán)為0的邊 原問題

    2024年02月14日
    瀏覽(27)
  • AIGC系列文章目錄 第三章 AIGC 簡單易用免費的AI圖像生成器: Stable Diffusion

    AIGC系列文章目錄 第三章 AIGC 簡單易用免費的AI圖像生成器: Stable Diffusion

    目前親測體驗的AI圖像生成器有NovelAI、MJ和Stable Diffusion。其中, 支持免費、無限生成、超高專業(yè)級畫質(zhì) 的只有 Stable Diffusion 。 Stable Diffusion 由 Stable Diffusion XL 提供支持,是一款最先進的工具,可以將您的想象力變?yōu)楝F(xiàn)實。 只需點擊幾下和簡單的文本輸入,您就可以創(chuàng)建令人

    2024年02月03日
    瀏覽(36)
  • 第三章 搜索與圖論(二)(最短路)

    第三章 搜索與圖論(二)(最短路)

    1、對于稠密圖,由于樸素版的dijkstra算法與邊數(shù)無關(guān)使用這種算法的復(fù)雜度較低。稀疏圖用堆優(yōu)化版的算法;單源最短路中存在負權(quán)邊用SPFA 算法通常較好;多源用floyd算法; ?難點:如何建圖,抽象為最短路問題。 由于稠密圖用這種算法,鄰接矩陣存圖,注意把g初始化為

    2024年02月21日
    瀏覽(17)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包