1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
|
//lecture du fichier GRAPHML
var g = new BidirectionalGraph<int, Edge<int>>();
using (var xreader = XmlReader.Create(@"C:\GraphML\test2.graphml"))
g.DeserializeFromGraphML(xreader,
id => int.Parse(id),
(source, target, id) => new Edge<int>(source, target)
);
int root = 68; // Le numéro du noeud source definie dans le fichier GraphML
Func<Edge<int>, double> edgeCost1 = b => 1; // Le cout definie comme constante
var predecessors = new VertexPredecessorRecorderObserver<int, Edge<int>>();
// utilisation de Dijkstra sur le graphe
DijkstraShortestPathAlgorithm<int, Edge<int>> dijkstra1 = new DijkstraShortestPathAlgorithm<int, Edge<int>>(g, edgeCost1);
//joindre un observateur de distance qui nous donne les distances du plus court chemin
VertexDistanceRecorderObserver<int, Edge<int>> distObserver1 = new VertexDistanceRecorderObserver<int, Edge<int>>(edgeCost1);
distObserver1.Attach(dijkstra1);
//joindre un "VertexPredecessorRecorderObserver" qui fournis les chemins
VertexPredecessorRecorderObserver<int, Edge<int>> predecessorObserver1 = new VertexPredecessorRecorderObserver<int, Edge<int>>();
predecessorObserver1.Attach(dijkstra1);
// On execute l'algorithme, on specifie le noeud source
dijkstra1.Compute(root);
foreach (KeyValuePair<int, double> kvp in distObserver1.Distances)
Console.WriteLine("Distance de la source jusqu'à le noeud {0} est {1}", kvp.Key, kvp.Value);
foreach (KeyValuePair<int, Edge<int>> kvp in predecessorObserver1.VertexPredecessors)
Console.WriteLine("Pour aller au noeud {0} il faut passer par le vecteur {1}", kvp.Key, kvp.Value); |
Partager