在给定图中,我需要检查图中所有节点之间的距离是否为<= 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 :(得分:2)
您可以从图形中创建一个矩阵,然后在该矩阵中找到较低的值,这在尝试查找节点之间的较短路径或对图形应用某种算法等时也很有用。
答案 1 :(得分:1)
首先,您的算法实际上是V *(V + E)。
我不确定您在实践中能否取得更好的进步。您肯定可以改善代码。
有些算法可以计算全对最短路径,例如Floyd-Warshall。针对您的情况(无向无权图)最快的一种称为Seidel算法。