簡體   English   中英

如何找到連接的子圖?

[英]How do I find a connected sub-graph?

我有一個網絡,但該網絡未連接。 我想知道如何在該網絡中找到最大的連接圖?

要計算節點所屬的連接組件,只需運行任何一種圖形搜索算法,例如廣度優先搜索

要解決您的問題,請遍歷網絡中的所有節點並執行以下操作:

  1. 如果給定節點已添加到組件中,請轉到下一個節點(繼續迭代)
  2. 如果尚未將節點添加到組件,請運行任何圖形搜索(例如,上面建議的BFS),並將所有訪問的節點標記為屬於同一組件。
  3. 選擇上面步驟2中構造的最大尺寸的組件。

設圖為a [n] [n],如果i,j被連接,則a [i] [j] = 1。

您可以執行以下操作。

count=0;/global


void dfs(int i)
{

int k;
for(k=0;k<n;k++)
    if(A[i][k]==1 && !visited[k])
    {
        count++;
        visited[k]=1;
        dfs(k);
    }
}
for(i=0; i < n;i++)
    {
        if(!visited[i])
        {
            count=1;
            visited[i]=1;
            dfs(i);
                            // map i with count .. here

        }
    }

因此,一旦完成了網絡中節點數量與節點之一的映射關系。

您現在要做的就是在地圖中找到具有最大數量的節點。

因此,您將獲得密鑰,它是具有count map(i)的大型網絡的節點。

將所有訪問的節點設為0,然后再次應用dfs(i),您可以使整個網絡與

無論如何,我和你都有數目。

另一種簡單的方法是使用union-find

S = array filled with 1s (|V| elements)

for each edge (u,v) in E:
    if find_set(u) != find_set(v):
        sum = S[find_set(u)] + S[find_set(v)]
        S[find_set(v)] = sum
        S[find_set(u)] = sum
        union_set(u, v)

最后,S [find_set(u)]將是節點u所屬的連接組件的大小。 要找到最大值,您只需要找到max(S)。

由於find_set和union_set都易於實現(每行兩行C ++),因此我發現此方法比DFS或BFS更干凈。

暫無
暫無

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

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