簡體   English   中英

使用DFS查找圖形(adjA)中的連接組件

[英]Finding connected components in graph (adjA) using DFS

我今天一直在互聯網上搜索,試圖弄清楚如何在鄰接表vector<list<edge>> adjA上運行DFS,但我只是無法弄清楚如何正確地做到這一點。 我可以在網上找到的最佳示例是: 在圖中找到連接的組件,但是使用他的第一種方法似乎無效,並且我對聯合/集沒有足夠的信心嘗試其他方法。 到目前為止,這就是我的意思:(忽略test_vectorcc ,我專注於使cc_count工作)

edge是一個包含以下內容的結構:

struct edge{
    int to; //copy of to_original (dont worry about this it's for a different functionality)
    int w; //weight of edge
    int from_original; //from vertex
    int to_original;  //to vertex
}

int main中的某處:

cout << "conn: " << connected(adjA, test_vector) << endl;

int connected(vector<list<edge>> &adjA, vector<short int> &cc){
        int v_size = adjA.size();
        vector<bool> discovered(false,v_size);
        int cc_count = 0;
        for(unsigned int u = 0; u < adjA.size(); u++){
            if(!discovered[u]){
                cout << u << endl;
                discovered[u] = true;
                cc_count+=1;
                dfs(adjA,discovered,cc,cc_count,u);
            }
        }
        return cc_count;
    }

    void dfs(vector<list<edge>>&adjA, vector<bool> &discovered, vector<short int> &cc, int &cc_count,int u){
    for(unsigned int v = 0; v < adjA[u].size();v++){
        if(!discovered[v]){
            cout << v << endl;
            discovered[v] = true;
            dfs(adjA, discovered,cc,cc_count,v);
        }
    }

    }

cout << v << endl; 然后cout << u << endl它將打印顯示它能夠訪問每個節點一次。 但是,我認為我錯誤地增加了cc_count 在此鄰接表中:

0->[1]->[3]->[5]
1->[0]->[2]->[3]->[4]
2->[1]->[4]
3->[0]->[1]->[4]->[5]
4->[1]->[2]->[3]->[5]->[6]
5->[0]->[3]->[4]->[6]
6->[4]->[5]

該程序將輸出:

0
1
2
3
4
5
6
conn: 7

當conn應該為1時,因為整個圖形都是單個組件。 我覺得我可能會走錯路了。 我應該做些改變嗎? 有沒有更好的方法使用DFS或BFS?

我為格式不正確而道歉,我花了近一個小時才試圖消除堆棧溢出錯誤。

鄰接表表示的圖

鄰接表表示的圖

您的dfs方法根本不關注邊緣。 從這個問題中我不知道什么是edge ,但僅假設它是成對的(兩個端點)。

然后

for(unsigned int v = 0; v < adjA[u].size();v++) {
    // do something with v
}

實際上應該是

for (auto const & e: adjA[u]) {
    // do something with the endpoint of e other than u
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM