📌  相关文章
📜  在边缘权重为0或1的完整图形中查找MST的权重

📅  最后修改于: 2021-04-23 21:38:46             🧑  作者: Mango

给定N个顶点的无向加权完整图。正好有M个边的权重为1,其余所有可能的边的权重为0。数组arr [] []给出了权重为1的边集。任务是计算该图的最小生成树的总权重。
例子:

方法:
对于要连接的N个节点的给定图,我们需要1个权重边的N- 1个边。步骤如下:

  1. 将给定图形存储在权重为1的所有边缘的地图中。
  2. 使用set来存储任何0权重的已连接组件中不包含的顶点。
  3. 对于当前存储在集合中的每个顶点,执行“ DFS遍历”并将“组件数”增加1,并从集合中删除“ DFS遍历”期间的所有已访问顶点。
  4. 在DFS遍历期间,在向量中包含0权重顶点,在另一个集合中包含1权重顶点。对向量中包含的所有顶点运行DFS遍历。
  5. 然后,将最小生成树的总权重指定为组件数– 1。

下面是上述方法的实现:

C++
// C++ Program to find weight of
// minimum spanning tree in a
// complete graph where edges
// have weight either 0 or 1
#include 
using namespace std;
 
// To store the edges of the given
// graph
map g[200005];
set s, ns;
 
// A utility function to perform
// DFS Traversal
void dfs(int x)
{
    vector v;
    v.clear();
    ns.clear();
 
    // Check those vertices which
    // are stored in the set
    for (int it : s) {
        // Vertices are included if
        // the weight of edge is 0
        if (!g[x][it]) {
            v.push_back(it);
        }
        else {
            ns.insert(it);
        }
    }
    s = ns;
    for (int i : v) {
        dfs(i);
    }
}
 
// A utility function to find the
// weight of Minimum Spanning Tree
void weightOfMST(int N)
{
    // To count the connected
    // components
    int cnt = 0;
 
    // Inserting the initial vertices
    // in the set
    for (int i = 1; i <= N; ++i) {
        s.insert(i);
    }
 
    // Traversing vertices stored in
    // the set and Run DFS Traversal
    // for each vertices
    for (; s.size();) {
 
        // Incrementing the zero
        // weight connected components
        ++cnt;
 
        int t = *s.begin();
        s.erase(t);
 
        // DFS Traversal for every
        // vertex remove
        dfs(t);
    }
 
    cout << cnt - 1;
}
 
// Driver's Code
int main()
{
    int N = 6, M = 11;
    int edges[][] = { { 1, 3 }, { 1, 4 },
                      { 1, 5 }, { 1, 6 },
                      { 2, 3 }, { 2, 4 },
                      { 2, 5 }, { 2, 6 },
                      { 3, 4 }, { 3, 5 },
                      { 3, 6 } };
 
    // Insert edges
    for (int i = 0; i < M; ++i) {
        int u = edges[i][0];
        int v = edges[i][1];
        g[u][v] = 1;
        g[v][u] = 1;
    }
 
    // Function call find the weight
    // of Minimum Spanning Tree
    weightOfMST(N);
    return 0;
}


Java
// Java Program to find weight of
// minimum spanning tree in a
// complete graph where edges
// have weight either 0 or 1
import java.util.*;
 
class GFG{
 
// To store the edges
// of the given graph
static HashMap[] g =
               new HashMap[200005];
static HashSet s =
               new HashSet<>();
static HashSet ns =
               new HashSet<>();
 
// A utility function to
// perform DFS Traversal
static void dfs(int x)
{
  Vector v = new Vector<>();
  v.clear();
  ns.clear();
 
  // Check those vertices which
  // are stored in the set
  for (int it : s)
  {
    // Vertices are included if
    // the weight of edge is 0
    if (g[x].get(it) != null)
    {
      v.add(it);
    }
    else
    {
      ns.add(it);
    }
  }
   
  s = ns;
   
  for (int i : v)
  {
    dfs(i);
  }
}
 
// A utility function to find the
// weight of Minimum Spanning Tree
static void weightOfMST(int N)
{
  // To count the connected
  // components
  int cnt = 0;
 
  // Inserting the initial vertices
  // in the set
  for (int i = 1; i <= N; ++i)
  {
    s.add(i);
  }
 
  Vector qt = new Vector<>();
   
  for (int t : s)
    qt.add(t);
   
  // Traversing vertices stored in
  // the set and Run DFS Traversal
  // for each vertices
  while (!qt.isEmpty())
  {
    // Incrementing the zero
    // weight connected components
    ++cnt;
    int t = qt.get(0);
    qt.remove(0);
     
    // DFS Traversal for every
    // vertex remove
    dfs(t);
  }
 
  System.out.print(cnt - 4);
}
 
// Driver's Code
public static void main(String[] args)
{
  int N = 6, M = 11;
  int edges[][] = {{1, 3}, {1, 4},
                   {1, 5}, {1, 6},
                   {2, 3}, {2, 4},
                   {2, 5}, {2, 6},
                   {3, 4}, {3, 5},
                   {3, 6}};
 
  for (int i = 0; i < g.length; i++)
    g[i] = new HashMap();
  // Insert edges
  for (int i = 0; i < M; ++i)
  {
    int u = edges[i][0];
    int v = edges[i][1];
    g[u].put(v, 1);
    g[v].put(u, 1);
 
  }
 
  // Function call find the weight
  // of Minimum Spanning Tree
  weightOfMST(N);
}
}
 
// This code is contributed by gauravrajput1


Python3
# Python3 Program to find weight of
# minimum spanning tree in a
# complete graph where edges
# have weight either 0 or 1
 
# To store the edges of the given
# graph
 
g = [dict() for i in range(200005)]
s = set()
ns = set()
  
# A utility function to perform
# DFS Traversal
def dfs(x):
    global s, g, ns
    v = []
    v.clear();
    ns.clear();
  
    # Check those vertices which
    # are stored in the set
    for it in s:
     
        # Vertices are included if
        # the weight of edge is 0
        if (x in g and not g[x][it]):
            v.append(it);
         
        else:
            ns.add(it);
 
    s = ns;
     
    for i in v:
     
        dfs(i);
 
# A utility function to find the
# weight of Minimum Spanning Tree
def weightOfMST( N):
 
    # To count the connected
    # components
    cnt = 0;
  
    # Inserting the initial vertices
    # in the set
    for i in range(1,N + 1):
     
        s.add(i);
     
    # Traversing vertices stored in
    # the set and Run DFS Traversal
    # for each vertices
    while(len(s) != 0):
  
        # Incrementing the zero
        # weight connected components
        cnt += 1
  
        t = list(s)[0]
        s.discard(t);
  
        # DFS Traversal for every
        # vertex remove
        dfs(t);
     
    print(cnt)
   
# Driver's Code
if __name__=='__main__':
     
    N = 6
    M = 11;
    edges = [ [ 1, 3 ], [ 1, 4 ],
                      [ 1, 5 ], [ 1, 6 ],
                      [ 2, 3 ], [ 2, 4 ],
                      [ 2, 5 ], [ 2, 6 ],
                      [ 3, 4 ], [ 3, 5 ],
                      [ 3, 6 ] ];
  
    # Insert edges
    for i in range(M):
     
        u = edges[i][0];
        v = edges[i][1];
        g[u][v] = 1;
        g[v][u] = 1;
      
    # Function call find the weight
    # of Minimum Spanning Tree
    weightOfMST(N);
 
# This code is contributed by pratham76


C#
// C# Program to find weight of
// minimum spanning tree in a
// complete graph where edges
// have weight either 0 or 1
using System;
using System.Collections;
using System.Collections.Generic;
 class GFG{
  
// To store the edges
// of the given graph
static Dictionary [] g =  new Dictionary[200005];
static HashSet s = new HashSet();
static HashSet ns = new HashSet();
  
// A utility function to
// perform DFS Traversal
static void dfs(int x)
{
  ArrayList v = new ArrayList();
   
  ns.Clear();
  
  // Check those vertices which
  // are stored in the set
  foreach (int it in s)
  {
    // Vertices are included if
    // the weight of edge is 0
    if (g[x].ContainsKey(it))
    {
      v.Add(it);
    }
    else
    {
      ns.Add(it);
    }
  }
  s = ns;  
  foreach(int i in v)
  {
    dfs(i);
  }
}
  
// A utility function to find the
// weight of Minimum Spanning Tree
static void weightOfMST(int N)
{
  // To count the connected
  // components
  int cnt = 0;
  
  // Inserting the initial vertices
  // in the set
  for (int i = 1; i <= N; ++i)
  {
    s.Add(i);
  }
  
  ArrayList qt = new ArrayList();
    
  foreach(int t in s)
    qt.Add(t);
    
  // Traversing vertices stored in
  // the set and Run DFS Traversal
  // for each vertices
  while (qt.Count != 0)
  {
    // Incrementing the zero
    // weight connected components
    ++cnt;
    int t = (int)qt[0];
    qt.RemoveAt(0);
      
    // DFS Traversal for every
    // vertex remove
    dfs(t);
  }
  
  Console.Write(cnt - 4);
}
  
// Driver's Code
public static void Main(string[] args)
{
  int N = 6, M = 11;
  int [,]edges = {{1, 3}, {1, 4},
                   {1, 5}, {1, 6},
                   {2, 3}, {2, 4},
                   {2, 5}, {2, 6},
                   {3, 4}, {3, 5},
                   {3, 6}};
  
  for (int i = 0; i < 11; i++)
    g[i] = new Dictionary();
     
  // Insert edges
  for (int i = 0; i < M; ++i)
  {
    int u = edges[i, 0];
    int v = edges[i, 1];
    g[u][v] = 1;
    g[v][u] = 1;
  }
  
  // Function call find the weight
  // of Minimum Spanning Tree
  weightOfMST(N);
}
}
 
// This code is contributed by rutvik_56


输出:
2

时间复杂度: O(N * log N + M),其中N是顶点数,M是边数。