Commit bf279019 by Corentin Bettiol

fix bugs + add graphs

parent 911e4e2b
......@@ -28,7 +28,7 @@ bool Graph::addArc(int n1, int n2, int d){
// si l'arc existe déjà
for(int i(0); i<arc.size(); i++){
if(arc[i][0] == getIdByNode(n1) && arc[i][1] == getIdByNode(n2)
if(arc[i][0] == getIdByNode(n1) && arc[i][1] == getIdByNode(n2))
return false;
}
......@@ -84,14 +84,12 @@ int Graph::MooreDijkstra(int debut, int fin){
// tant qu'on explore pas le dernier nœud on continue d'explorer
// faudrait vérifier qu'on puisse rejoindre fin depuis début, mais on verra ça une autre fois
while(current != fin){
for(int aa(0); aa<node.size(); aa++){
if(verbose)
cout << "----\n-current: " << current << "\n-d[" << current << "]: " << d[current] << "\n-pere[" << current << "]: " << pere[current] << endl;
// on change de nœud et on mets les arcs qui en partent sur la liste des arcs à visiter
minArcDispo(&current, &p);
newd = d[p]+distArcCourantPere(current, p); // distance de l'arc que l'on explore
// on change de nœud et on mets les arcs qui en partent sur la liste des arcs à visiter, et on màj la distance pour aller au nœud changé
minArcDispo(&current, &p, &newd);
// si cet itinéraire est plus rapide que MAX_INT ou que celui qu'on a déjà fait avant
if(d[current] > newd){
......@@ -123,7 +121,7 @@ int Graph::MooreDijkstra(int debut, int fin){
// prend la plus petite distance des arcs qui sont à visiter
void Graph::minArcDispo(int *current, int *pere){
void Graph::minArcDispo(int *current, int *pere, int *newd){
if(verbose)
cout << "--minArcDispo\n arcs availables:" << endl;
......@@ -155,40 +153,17 @@ void Graph::minArcDispo(int *current, int *pere){
cout << " selected: "<< arc[min[3]][0] << "->" << arc[min[3]][1] << "(" << min[0] << ")\n--end" << endl;
// cet arc n'est plus à visiter
arc[min[3]][3] = 0;
arc[min[3]][3] = 2;
// en revanche ceux qui partent de ce nouveau nœud oui
setFutureNodesToTrue(min[2]);
// on change les vars
*current = min[2]; // to
*pere = min[1]; // from
}
// distance entre le nœud courant (c) et le père (p)
int Graph::distArcCourantPere(int c, int p){
if(verbose)
cout << "--distArcCourantPere - " << p << "->" << c << endl;
// exploration des arcs
for(int i(0); i<arc.size(); i++){
// distance
*newd = d[*pere]+min[0];
if(verbose)
cout << " " << arc[i][0] << "->" << arc[i][1] << "(" << arc[i][2] << ")[" << arc[i][3] << "]" << endl;
// si c'est le bon arc
if(arc[i][0] == p && arc[i][1] == c){
if(verbose)
cout << " found " << arc[i][2] << " !\n--end\n" << endl;
// on renvoie sa distance
return arc[i][2];
}
}
if(verbose)
cout << " not found\n--end\n" << endl;
}
......@@ -200,7 +175,7 @@ void Graph::setFutureNodesToTrue(int n){
// exploration des arcs
for(int i(0); i<arc.size(); i++){
if(arc[i][0] == n){ // id from == id nœud ?
if(arc[i][0] == n && arc[i][3] != 2){ // id from == id nœud ?
if(verbose)
cout << " " << arc[i][0] << "->" << arc[i][1] << endl;
......
#ifndef GRAPHCLASS_H
#define GRAPHCLASS_H
#include <vector>
#include <vector>
class Graph{
// liste de nœuds (index != numéro du nœud)
......@@ -17,7 +17,7 @@
std::vector<int> d;
// debug, mettre à true et recompiler pour un output des étapes dans le terminal
bool verbose = false;
bool verbose = true;
public:
Graph();
......@@ -26,8 +26,7 @@
void display();
int min(int, int);
int MooreDijkstra(int, int);
void minArcDispo(int*, int*);
int distArcCourantPere(int, int);
void minArcDispo(int*, int*, int*);
int getIdByNode(int);
int getNodeById(int);
void setFutureNodesToTrue(int);
......
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
0
1
2
1
2
3
2
3
6
3
3
9
1
2
9
8
9
10
6
10
6
5
10
11
2
11
19
1
19
18
4
18
12
2
12
17
2
17
20
9
17
15
5
12
15
6
6
8
3
8
11
5
2
5
3
5
8
3
1
4
2
4
5
4
1
13
3
13
4
2
13
14
7
14
7
3
5
7
4
5
15
1
7
16
3
16
15
2
0
1
2
3
4
0
1
2
3
2
4
4
1
3
5
3
4
1
0
// g++ main.cpp -o main -std=c++11
// ./main
#include <iostream>
#include "Graph.cpp"
......@@ -40,24 +42,33 @@ int main(){
}
g.display();
cout << "\n" << endl;
int d = g.MooreDijkstra(1,10);
cout << "Entrez le trajet à calculer avec la forme from->to (0 sur \"from\" pour arrêter):" << endl;
int from(1), to, d;
while(from != 0){
cout << "from>>";
cin >> from;
if(from != 0){
cout << "to>>";
cin >> to;
cout << "\n\npcc:\n>>>" << d << endl;
d = g.MooreDijkstra(from,to);
cout << "\nshortest path:" << endl;
g.display_shortest_paths(g.getIdByNode(10));
cout << "\npcc:\n>> " << d << endl;
cout << "\nshortest path:" << endl;
for(int i(0); i<to; i++){
g.display_shortest_paths(i);
cout << "\n" << endl;
}
d = g.MooreDijkstra(3,8);
cout << "\n\npcc:\n>>>" << d << endl;
}
}
cout << "\nshortest path:" << endl;
g.display_shortest_paths(g.getIdByNode(8));
cout << "Bye." << endl;
return 0;
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment