나는 그것이 전에 물어볼 수있는 것을 알고 있지만 그것을 찾을 수 없다. 2 노드 사이의 최단 경로 인 을 찾기에 좋은 dijkstra 알고리즘을 수정해야하지만 가능한 모든 경로도 찾아야합니다. 이렇게하는 것이 상대적으로 쉽다는 것을 알고 있습니다 만, 지금까지는이 간단한 방법을 사용하는 방법이 없습니다. . 나는 가중 그래프를 사용하고있다.dijkstra 알고리즘을 수정하여 가능한 모든 경로를 찾는 방법은 무엇입니까?
class Dijkstra
{
private List<Node> _nodes;
private List<Edge> _edges;
private List<Node> _basis;
private Dictionary<string, double> _dist;
private Dictionary<string, Node> _previous;
public Dijkstra(List<Edge> edges, List<Node> nodes)
{
Edges = edges;
Nodes = nodes;
Basis = new List<Node>();
Dist = new Dictionary<string, double>();
Previous = new Dictionary<string, Node>();
// record node
foreach (Node n in Nodes)
{
Previous.Add(n.Name, null);
Basis.Add(n);
Dist.Add(n.Name, double.MaxValue);
}
}
/// Calculates the shortest path from the start
/// to all other nodes
public void calculateDistance(Node start)
{
Dist[start.Name] = 0;
while (Basis.Count > 0)
{
Node u = getNodeWithSmallestDistance();
if (u == null)
{
Basis.Clear();
}
else
{
foreach (Node v in getNeighbors(u))
{
double alt = Dist[u.Name] + getDistanceBetween(u, v);
if (alt < Dist[v.Name])
{
Dist[v.Name] = alt;
Previous[v.Name] = u;
}
}
Basis.Remove(u);
}
}
}
public List<Node> getPathTo(Node d)
{
List<Node> path = new List<Node>();
path.Insert(0, d);
while (Previous[d.Name] != null)
{
d = Previous[d.Name];
path.Insert(0, d);
}
return path;
}
public Node getNodeWithSmallestDistance()
{
double distance = double.MaxValue;
Node smallest = null;
foreach (Node n in Basis)
{
if (Dist[n.Name] < distance)
{
distance = Dist[n.Name];
smallest = n;
}
}
return smallest;
}
public List<Node> getNeighbors(Node n)
{
List<Node> neighbors = new List<Node>();
foreach (Edge e in Edges)
{
if (e.Origin.Equals(n) && Basis.Contains(n))
{
neighbors.Add(e.Destination);
}
}
return neighbors;
}
public double getDistanceBetween(Node o, Node d)
{
foreach (Edge e in Edges)
{
if (e.Origin.Equals(o) && e.Destination.Equals(d))
{
return e.Distance;
}
}
return 0;
}
public List<Node> Nodes
{
get { return _nodes; }
set { _nodes = value; }
}
public List<Edge> Edges
{
get { return _edges; }
set { _edges = value; }
}
public List<Node> Basis
{
get { return _basis; }
set { _basis = value; }
}
public Dictionary<string, double> Dist
{
get { return _dist; }
set { _dist = value; }
}
public Dictionary<string, Node> Previous
{
get { return _previous; }
set { _previous = value; }
}
}
}
static void Main(string[] args)
{
//Nodes initialisation goes here
Dijkstra d = new Dijkstra(_edges, _nodes);
d.calculateDistance(_dictNodes["A"]);
List<Node> path = d.getPathTo(_dictNodes["C"]);
}
나는이 방법을 추가했다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야한다"는 것을 참조하십시오. –
이 알고리즘이 어떻게 작동하는지 알고 계십니까? 일단 그렇게하면 모든 경로를 반환하기 위해 경로를 변경하는 방법을 찾는 것이 훨씬 쉽습니다. –