[英]How do I find a connected sub-graph?
我有一個網絡,但該網絡未連接。 我想知道如何在該網絡中找到最大的連接圖?
要計算節點所屬的連接組件,只需運行任何一種圖形搜索算法,例如廣度優先搜索 。
要解決您的問題,請遍歷網絡中的所有節點並執行以下操作:
設圖為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.