成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

無向圖的處理算法(四)連通分量

asce1885 / 3515人閱讀

這篇講的是連通分量,連通分量是深度優(yōu)先搜索算法的一個(gè)應(yīng)用。
每進(jìn)行了一次dfs,就會(huì)找到一條連通分量。
定義如下的API

public class CC
    CC(Graph g)      預(yù)處理構(gòu)造函數(shù)
    boolean connected(int v,in w)  v和w連通嗎
    int count()     改圖中的連通分量個(gè)數(shù)
    int id(int v)   頂點(diǎn)v所在的連通分量編號(hào)

具體實(shí)現(xiàn)如下:

package Graph;

public class CC {
    /*
     * 計(jì)算一個(gè)圖中的連通分量,從起始點(diǎn)開始進(jìn)行dfs算法,同時(shí)用一個(gè)以頂點(diǎn)作為索引的數(shù)組id[]來保存該點(diǎn)所在的連通分量的起始點(diǎn),也就是id
     * 這樣,判斷兩個(gè)點(diǎn)是否處于同一個(gè)連通分量,只要判斷id是否相同
     */
    private boolean[] marked;
    private int[] id;
    private int count;

    public CC(Graph G){
        marked = new boolean[G.V()];
        id = new int[G.V()];
        for(int s = 0;s < G.V();s++){
            if(!marked[s]){
                dfs(G,s);
                count++;
            }
        }
    }
    private void dfs(Graph G,int v){
        marked[v] = true;
        id[v] = count;          //該連通分量的起始節(jié)點(diǎn)
        for(int w:G.adj(v)){
            if(!marked[w])
                dfs(G,w);
        }
    }

    public boolean connected(int v,int w){
        return id[v] == id[w];
    }
    public int id(int v){
        return id[v];
    }
    public int count(){
        return count;
    }
}

同樣還能解決雙色問題,即“能夠用兩種不同顏色將頂點(diǎn)著色,使得相鄰的頂點(diǎn)顏色不同嗎?等價(jià)于這個(gè)圖是一個(gè)二分圖嗎?

/*
 * 使用dfs算法,來判斷一個(gè)圖中的頂點(diǎn)是否可以用兩種顏色染色,使得相鄰的頂點(diǎn)顏色不同
 * 也就是,判斷該圖是否是一個(gè)二分圖:
 * 設(shè)G=(V,E)是一個(gè)無向圖,如果頂點(diǎn)V可分割為兩個(gè)互不相交的子集(A,B),并且圖中的每條邊(i,j)所關(guān)聯(lián)的兩個(gè)頂點(diǎn)i和j分別屬于這兩個(gè)不同的頂點(diǎn)集(i in A,j in B),則稱圖G為一個(gè)二分圖。
 * 
 */
public class TwoColor {
    private boolean[] marked;
    private boolean[] color;
    private boolean isTwoColorable = true;

    public TwoColor(Graph G){
        marked = new boolean[G.V()];
        color = new boolean[G.V()];
        for(int s = 0;s < G.V();s++){
            if(!marked[s])
                dfs(G,s);
        }
    }

    private void dfs(Graph G,int v){
        marked[v] = true;
        for(int w: G.adj(v)){
            if(!marked[w]){
                color[w] =!color[v];
            }
            else if (color[w] == color[v])
                isTwoColorable = false;
        }
    }
    public boolean isTwoColorable(){
        return isTwoColorable;
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64338.html

相關(guān)文章

  • 算法版4.1-無向圖詳解

    摘要:樹是一副無環(huán)連通圖?;ゲ幌噙B的樹組成的集合稱為森林。表示無向圖的數(shù)據(jù)類型圖的基本操作的兩個(gè)構(gòu)造,得到頂點(diǎn)數(shù)和邊數(shù),增加一條邊。該方法不符合第一個(gè)條件,上百萬個(gè)頂點(diǎn)的圖是很常見的空間不滿足。 四種重要的圖模型: 無向圖(簡(jiǎn)單連接) 有向圖(連接有方向性) 加權(quán)圖(連接帶有權(quán)值) 加權(quán)有向圖(連接既有方向性又帶有權(quán)值) 無向圖 定義:由一組頂點(diǎn)和一組能夠?qū)蓚€(gè)頂點(diǎn)相連的邊組成。 特殊:...

    scola666 評(píng)論0 收藏0
  • 算法(第4版) Chapter 4.1 無向

    摘要:邊僅由兩個(gè)頂點(diǎn)連接,并且沒有方向的圖稱為無向圖。用分隔符當(dāng)前為空格,也可以是分號(hào)等分隔。深度優(yōu)先算法最簡(jiǎn)搜索起點(diǎn)構(gòu)造函數(shù)找到與起點(diǎn)連通的其他頂點(diǎn)。路徑構(gòu)造函數(shù)接收一個(gè)頂點(diǎn),計(jì)算到與連通的每個(gè)頂點(diǎn)之間的路徑。 Algorithms Fourth EditionWritten By Robert Sedgewick & Kevin WayneTranslated By 謝路云Chapter...

    kamushin233 評(píng)論0 收藏0
  • 算法(第4版) Chapter 4.2 強(qiáng)聯(lián)通性 Tarjan算法補(bǔ)充

    摘要:在實(shí)際的測(cè)試中,算法的運(yùn)行效率也比算法高左右。此外,該算法與求無向圖的雙連通分量割點(diǎn)橋的算法也有著很深的聯(lián)系。學(xué)習(xí)該算法,也有助于深入理解求雙連通分量的算法,兩者可以類比組合理解。固屬于同一連通分支。 參考資料http://blog.csdn.net/acmmmm/a...https://www.byvoid.com/blog/s...http://blog.csdn.net/noth...

    maybe_009 評(píng)論0 收藏0
  • 算法之不定期更新(三)(2018-04-24)

    摘要:實(shí)現(xiàn)這個(gè)想法之后就發(fā)現(xiàn),時(shí)間復(fù)雜度真的太高了。本期算法小分享就到這里咯剛做完探索里的初級(jí),還有好多已經(jīng)說爛了的題就不分享了。如果有什么意見或者想法歡迎在評(píng)論區(qū)和我交流 題目 input: n // 代表無向圖的頂點(diǎn)數(shù) // 從1開始 m // 無向圖的邊數(shù) arr1 // 各邊的情況,形如[[1, 2], [3, 4],...](代表頂點(diǎn)0和頂點(diǎn)2相連,頂點(diǎn)3和頂點(diǎn)4相連) ...

    darryrzhong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<