代码之家  ›  专栏  ›  技术社区  ›  Zag Gol

检查图中所有节点之间的距离是否小于等于k

  •  0
  • Zag Gol  · 技术社区  · 5 年前

    在给定的图中,我需要检查图中的所有节点是否彼此之间的距离为<=k。

    我写了一个解决方案(简单的C),在每个节点上运行一个循环,然后检查他与所有其他节点之间是否有k距离,但是时间复杂度是v*(v+e)。 有更有效的方法吗?

    代码:

    // node defenition
    public class GraphNode
    {
       public GraphNode(int data, List<GraphNode> neighbours)
       {
            Data = data;
           Neighbours = neighbours;
       }
    }
    
    // Loop on every Node, and find all k-distance neighbours
    public bool IfAllGraphNodesInKdistance1(List<GraphNode> nodes, int k)
    {
        for(int i=1; i< nodes.Count; i++)
        {
             if(FindKdistanceNeighboursInGraph(nodes[i], k).Count != nodes.Count)
                    return false;
            }
            return true;
        }
    }
    
    
    // Find k-distance neighbours of a Node
    public HashSet<GraphNode> FindKdistanceNeighboursInGraph(GraphNode node, int distance )
    {
    
        HashSet<GraphNode> resultHash = new HashSet<GraphNode>();
    
        if (node != null && distance > 0)
        {
            HashSet<GraphNode> visited = new HashSet<GraphNode>();
            Queue<GraphNode> queue1 = new Queue<GraphNode>();
            Queue<GraphNode> queue2 = new Queue<GraphNode>();
            queue1.Enqueue(node);
            visited.Add(node);
            int currentDistance = 0;
            while (queue1.Count > 0 && currentDistance < distance)
            {
                GraphNode current = queue1.Dequeue();
                foreach (GraphNode graphNode in current.Neighbours)
                {
                    if (!visited.Contains(graphNode))
                    {
                        queue2.Enqueue(graphNode);
                        visited.Add(graphNode);
                        resultHash.Add(graphNode);
                    }
                }
                if (queue1.Count == 0)
                {
                    queue1 = queue2;
                    queue2 = new Queue<GraphNode>();
                    currentDistance++;
                }
            }
        }
        resultHash.Add(node); // if it will include current
        return resultHash;
    }
    
    0 回复  |  直到 5 年前
        1
  •  2
  •   Maxim Rozhok    5 年前

    您可以从图中创建一个矩阵,然后在该矩阵中找到较低的值,当您试图在节点之间找到较短的路径或在图中应用一些算法等时,它也很有用。

    Simple example of representing a graph as matrix

        2
  •  1
  •   ciamej    5 年前

    首先,您的算法实际上是v*(v+e)。

    我不确定你能否在实践中有所进步。您当然可以改进代码。

    有计算所有对最短路径的算法,如Floyd Warshall。对于您的情况(无向无权重图)来说,最快的是Seidel算法。