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

代碼隨想錄| 圖論04 查并集 ●查并集理論知識(shí) ●1971.尋找圖中是否存在路徑 ●684.冗余連接 ●685.冗余連接II

這篇具有很好參考價(jià)值的文章主要介紹了代碼隨想錄| 圖論04 查并集 ●查并集理論知識(shí) ●1971.尋找圖中是否存在路徑 ●684.冗余連接 ●685.冗余連接II。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

#查并集理論知識(shí)

?

并查集用處:解決連通性問題

  • 將兩個(gè)元素添加到一個(gè)集合中。
  • 判斷兩個(gè)元素在不在同一個(gè)集合

思路:將三個(gè)元素A,B,C (分別是數(shù)字)放在同一個(gè)集合,其實(shí)就是將三個(gè)元素連通在一起,如何連通:只需要用一個(gè)一維數(shù)組來表示,即:father[A] = B,father[B] = C 這樣就表述 A 與 B 與 C連通了(有向連通圖)。如果幾個(gè)元素的根是同一個(gè),代表在同一集合。

find的路徑壓縮:

代碼隨想錄| 圖論04 查并集 ●查并集理論知識(shí) ●1971.尋找圖中是否存在路徑 ●684.冗余連接 ●685.冗余連接II,代碼隨想錄一刷,c++,leetcode,算法,圖論

代碼隨想錄| 圖論04 查并集 ●查并集理論知識(shí) ●1971.尋找圖中是否存在路徑 ●684.冗余連接 ●685.冗余連接II,代碼隨想錄一刷,c++,leetcode,算法,圖論

就需要?路徑壓縮,將非根節(jié)點(diǎn)的所有節(jié)點(diǎn)直接指向根節(jié)點(diǎn)

代碼隨想錄| 圖論04 查并集 ●查并集理論知識(shí) ●1971.尋找圖中是否存在路徑 ●684.冗余連接 ●685.冗余連接II,代碼隨想錄一刷,c++,leetcode,算法,圖論

路徑壓縮長一點(diǎn)寫:

int find(int u) {
    if (u == father[u]) return u;
    else return father[u] = find(father[u]); // 路徑壓縮
}

?路徑壓縮短一點(diǎn)寫:

int find(int u) {
    return u == father[u] ? u : father[u] = find(father[u]);
}

?隨想錄的查并集模板:

int n = 1005; // n根據(jù)題目中節(jié)點(diǎn)數(shù)量而定,一般比節(jié)點(diǎn)數(shù)量大一點(diǎn)就好
vector<int> father = vector<int> (n, 0); // C++里的一種數(shù)組結(jié)構(gòu)

// 并查集初始化
void init() {
    for (int i = 0; i < n; ++i) {
        father[i] = i;
    }
}
// 并查集里尋根的過程
int find(int u) {
    return u == father[u] ? u : father[u] = find(father[u]); // 路徑壓縮
}

// 判斷 u 和 v是否找到同一個(gè)根
bool isSame(int u, int v) {
    u = find(u);
    v = find(v);
    return u == v;
}

// 將v->u 這條邊加入并查集
void join(int u, int v) {
    u = find(u); // 尋找u的根
    v = find(v); // 尋找v的根
    if (u == v) return ; // 如果發(fā)現(xiàn)根相同,則說明在一個(gè)集合,不用兩個(gè)節(jié)點(diǎn)相連直接返回
    father[v] = u;
}

#?1971.尋找圖中是否存在路徑??并查集基礎(chǔ)題目

我用dfs做的,自己處理edge信息,夢(mèng)回3343 3391了

void dfs(int start, int dest, vector<vector<int>>& edges, vector<vector<int>> &path, vector<bool> &v,bool &flag){
        if(start==dest){
            flag=true;
            return;
        }
        v[start]=true;
        for(int i=0;i<path[start].size();i++){
            if(!v[path[start][i]]) dfs(path[start][i], dest,edges,path,v,flag);
        }
    }


    bool validPath(int n, vector<vector<int>>& edges, int source, int dest) {
        vector<vector<int>> path(n);
        vector<bool> v(n,false);
        bool flag=false;

        for(int i=0;i<edges.size();i++){
            //edges[i] = [ui, vi]   edges[i][0] edges[i][1]
            path[edges[i][0]].push_back(edges[i][1]);
            path[edges[i][1]].push_back(edges[i][0]);
        }

        dfs(source,dest,edges,path,v,flag);
        return flag;
        
    }

查并集做法:(要把模板學(xué)會(huì)記住)自己寫的:

    int n=200001;
    vector<int> father=vector<int> (n,0);

    void init(){
        for(int u=0;u<n;u++) father[u]=u;
    }

    int find(int u){
        if(u==father[u]) return u;
        return father[u]=find(father[u]);
    }

    bool isSame(int u, int v){
        u=find(u);
        v=find(v);
        return u==v;
    }

    void join(int u, int v){
        u=find(u);
        v=find(v);
        if(u!=v) father[u]=v;
    }

    bool validPath(int n, vector<vector<int>>& edges, int source, int dest) {
  
        init();
        for(int i=0;i<edges.size();i++){
            join(edges[i][0],edges[i][1]);
        }
        return isSame(source,dest);
    }

記住,所有函數(shù)最外面這么寫會(huì)錯(cuò):

int n=200001;

vector<int> father(n,0);?

但是vector<int> father = vector<int>(n,0);? 這樣寫就可以(我不知道為什么

因?yàn)椋涸贑++中,同一個(gè)編譯單元(通常就是一個(gè)源文件)內(nèi)的全局變量的初始化順序是不確定的。編譯器可能以任何順序初始化它們,這個(gè)順序通常取決于編譯器的實(shí)現(xiàn),是不可預(yù)測(cè)的。


#684.冗余連接?

我沒想到思路

判斷成環(huán):已經(jīng)有同樣的根,但是又來一個(gè)edge連接兩者。

join易錯(cuò)點(diǎn):最后一步 father[u]=v, father[v]=u 都可以,但是被賦值的一定要是father,不能反文章來源地址http://www.zghlxwxcb.cn/news/detail-601012.html

int n=1001;
    vector<int> father=vector<int>(n,0);

    void init(){
        for(int u=0;u<n;u++) father[u]=u;
    }

    int find(int u){
        if(u==father[u]) return u;
        return father[u]=find(father[u]);
    }

    void join(int u, int v){
        u=find(u);
        v=find(v);
        
        if(u!=v) father[v]=u;
    }

    bool isSame(int u, int v){
        u=find(u);
        v=find(v);
        return u==v;
    }

    vector<int> findRedundantConnection(vector<vector<int>>& edges) {
        init();
        for(int i=0;i<edges.size();i++){
            if(isSame(edges[i][0],edges[i][1])) return edges[i];
            join(edges[i][0],edges[i][1]);
             
        }
        return {};
    }

到了這里,關(guān)于代碼隨想錄| 圖論04 查并集 ●查并集理論知識(shí) ●1971.尋找圖中是否存在路徑 ●684.冗余連接 ●685.冗余連接II的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(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)文章

  • 代碼隨想錄圖論 第五天| 841.鑰匙和房間 463. 島嶼的周長

    代碼隨想錄圖論 第五天| 841.鑰匙和房間 一、 841.鑰匙和房間 題目鏈接:https://leetcode.cn/problems/keys-and-rooms/ 思路:鑰匙就是索引,遍歷過就標(biāo)記,每拿到一個(gè)房間的鑰匙,直接for循環(huán)遞歸遍歷,深度優(yōu)先直接拿下。 二、463. 島嶼的周長 題目鏈接:https://leetcode.cn/problems/island-

    2024年02月06日
    瀏覽(19)
  • 代碼隨想錄圖論 第一天 | 797.所有可能的路徑 200. 島嶼數(shù)量

    代碼隨想錄圖論 第一天 | 797.所有可能的路徑 200. 島嶼數(shù)量 一、797.所有可能的路徑 題目鏈接:https://leetcode.cn/problems/all-paths-from-source-to-target/ 思路:求從0到n-1的所有路徑,終止條件是當(dāng)前節(jié)點(diǎn)為n-1。本題圖的結(jié)構(gòu)是group[][],group[x]表示x節(jié)點(diǎn)所能到達(dá)的所有節(jié)點(diǎn)的集合,深度

    2024年02月08日
    瀏覽(32)
  • 代碼隨想錄圖論 第二天 | 695. 島嶼的最大面積 1020. 飛地的數(shù)量

    代碼隨想錄圖論 第二天 | 695. 島嶼的最大面積 1020. 飛地的數(shù)量 一、695. 島嶼的最大面積 題目鏈接:https://leetcode.cn/problems/max-area-of-island/ 思路:典型的遍歷模板題,我采用深度優(yōu)先,每塊島嶼遞歸遍歷的時(shí)候計(jì)數(shù),遞歸完比較大小記錄最大值。 二、1020. 飛地的數(shù)量 題目鏈接

    2024年02月07日
    瀏覽(20)
  • 代碼隨想錄Day42-圖論:力扣第417m、841m、463e題

    題目鏈接 代碼隨想錄文章講解鏈接 方法一: 用時(shí):1h0m58s 思路 直接找哪些點(diǎn)既可以到達(dá)太平洋又可以到達(dá)大西洋比較麻煩,換個(gè)角度,找到太平洋可以逆流而上到達(dá)的點(diǎn),再找到大西洋可以逆流而上到達(dá)的點(diǎn),兩者的交集就是所需要的答案。 用兩個(gè)二維數(shù)組分別記錄太平洋

    2024年02月05日
    瀏覽(22)
  • 代碼隨想錄圖論|130. 被圍繞的區(qū)域 417太平洋大西洋水流問題

    代碼隨想錄圖論|130. 被圍繞的區(qū)域 417太平洋大西洋水流問題

    **題目:**給你一個(gè) m x n 的矩陣 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 圍繞的區(qū)域,并將這些區(qū)域里所有的 ‘O’ 用 ‘X’ 填充。 題目鏈接:130. 被圍繞的區(qū)域 解題思路:在飛地的基礎(chǔ)上做改動(dòng),使用一個(gè)棧存儲(chǔ)需要改變的節(jié)點(diǎn) 題目 :有一個(gè) m × n 的矩形島

    2024年02月04日
    瀏覽(20)
  • 代碼隨想錄Day41-圖論:力扣第797m、200m、695m、1020m、130m題

    題目鏈接 代碼隨想錄文章講解鏈接 方法一:DFS 用時(shí):11m43s 思路 時(shí)間復(fù)雜度: O ( n ? 2 n ) O(n cdot 2^n) O ( n ? 2 n ) ,n是節(jié)點(diǎn)個(gè)數(shù),最壞情況每個(gè)節(jié)點(diǎn)都可以去往任意一個(gè)在它后面的節(jié)點(diǎn),那么第i個(gè)節(jié)點(diǎn)去到最后一個(gè)節(jié)點(diǎn)的路徑數(shù)就有 2 n ? i ? 2 2^{n-i-2} 2 n ? i ? 2 ,就是

    2024年02月06日
    瀏覽(24)
  • 代碼隨想錄圖論 第三天 | 130. 被圍繞的區(qū)域 417. 太平洋大西洋水流問題

    代碼隨想錄圖論 第三天 | 130. 被圍繞的區(qū)域 417. 太平洋大西洋水流問題 一、130. 被圍繞的區(qū)域 題目鏈接:https://leetcode.cn/problems/surrounded-regions/ 思路:題目要求沾邊的不動(dòng),只改沒沾邊的,那么可以先dfs遍歷4條邊,把沾邊的O都改成A。然后直接兩層for循環(huán)遍歷整個(gè)數(shù)組,把O該

    2024年02月07日
    瀏覽(18)
  • 代碼隨想錄第44天|動(dòng)態(tài)規(guī)劃:完全背包理論基礎(chǔ) 518.零錢兌換II 377. 組合總和 Ⅳ

    代碼隨想錄第44天|動(dòng)態(tài)規(guī)劃:完全背包理論基礎(chǔ) 518.零錢兌換II 377. 組合總和 Ⅳ

    代碼隨想錄 (programmercarl.com) 動(dòng)態(tài)規(guī)劃之完全背包,裝滿背包有多少種方法?組合與排列有講究!| LeetCode:518.零錢兌換II_嗶哩嗶哩_bilibili 完全背包和01背包問題唯一不同的地方就是,每種物品有無限件 。 完全背包中的物品可以添加多次,所以要從小到大遍歷: 518. 零錢兌換

    2024年04月25日
    瀏覽(26)
  • 代碼隨想錄day3|鏈表理論基礎(chǔ)、移除鏈表元素、設(shè)計(jì)鏈表、翻轉(zhuǎn)鏈表

    代碼隨想錄day3|鏈表理論基礎(chǔ)、移除鏈表元素、設(shè)計(jì)鏈表、翻轉(zhuǎn)鏈表

    1、基本類型:單鏈表、雙鏈表、循環(huán)鏈表 2、存儲(chǔ)方式:和數(shù)組不一樣,鏈表是隨機(jī)存儲(chǔ)在內(nèi)存中,不是連續(xù)分配在內(nèi)存中。 3、鏈表的定義: 定義了一個(gè)數(shù)據(jù)域,還有一個(gè)指針域,并且定義了一個(gè)構(gòu)造函數(shù)。 4、鏈表的操作: 刪除節(jié)點(diǎn): ?在圖中,若需要?jiǎng)h除D這個(gè)節(jié)點(diǎn),只

    2024年02月05日
    瀏覽(29)
  • 代碼隨想錄day6|哈希表理論基礎(chǔ)、有效的字母異位詞、兩個(gè)數(shù)組的交集、快樂數(shù)、兩數(shù)之和

    代碼隨想錄day6|哈希表理論基礎(chǔ)、有效的字母異位詞、兩個(gè)數(shù)組的交集、快樂數(shù)、兩數(shù)之和

    當(dāng)需要判斷一個(gè)元素是否在一個(gè)集合中,哈希表的時(shí)間復(fù)雜度只有O(1)。 哈希表有一個(gè)映射的操作,當(dāng)映射的元素在同一個(gè)索引下標(biāo)的位置,就會(huì)引發(fā) 哈希碰撞 。 哈希碰撞的兩種解決方法:拉鏈法 線性探測(cè)法? ?同時(shí),哈希表還有常見的三種數(shù)據(jù)結(jié)構(gòu):分別是數(shù)組、集合s

    2024年02月06日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包