-
Notifications
You must be signed in to change notification settings - Fork 0
/
plan_de_metro_dijkstra.cpp
101 lines (84 loc) · 2.95 KB
/
plan_de_metro_dijkstra.cpp
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <cassert>
#include <limits>
#include <numeric>
#include <queue>
#include <cmath>
#include <utility>
//objectif : trouver le chemin le plus long du graph
struct Step
{
int cumul_distance;
int from;
int to;
bool operator<(const Step &other) const
{
return cumul_distance > other.cumul_distance;
}
};
int dijkstra(int indice_max_station, int station_depart, auto compute_distance, auto neighbours)
{
std::vector<int> cumul_distances(indice_max_station, indice_max_station);
std::vector<int> from(indice_max_station, -1);
cumul_distances[station_depart]=0;
std::priority_queue<Step> pq;
pq.push(Step{0, -1, station_depart});
while (!pq.empty())
{
Step top = pq.top();
pq.pop();
if (top.cumul_distance > cumul_distances[top.to])
continue;
from[top.to]= top.from;
cumul_distances[top.to] = top.cumul_distance;
for (auto k : neighbours(top.to))
{
int d = compute_distance(k, top.to);
if (d== -1)
continue;
pq.push(Step{top.cumul_distance + d, top.to, k});
}
}
cumul_distances.erase(std::remove(cumul_distances.begin(), cumul_distances.end(), indice_max_station), cumul_distances.end());
int chemin_max = *std::max_element(cumul_distances.begin(), cumul_distances.end()) -1;
return chemin_max;
}
int main()
{
bool debug = false;
bool debug_couple = false;
int station_depart;
std::cin >> station_depart ;
if (debug_couple) std::cerr << "station de départ " << station_depart << std::endl;
int nb_couple ;
std::cin >> nb_couple;
int nb_max_station = 1001;
std::vector<std::vector<int>> neighbours_matrix(nb_max_station, std::vector<int>());
if (debug) std::cerr << " on va enregistrer les couples" << std::endl;
for (int i =0; i< nb_couple; i++)
{
int station_a; int station_b;
std::cin >> station_a >> station_b ;
if (debug) std::cerr<< "lecture du couple " << i << " . Première station :" << station_a << " . deuxième station : " << station_b << std::endl;
if (debug_couple) std::cerr << station_a << ' ' << station_b << std::endl;
neighbours_matrix[station_a].emplace_back(station_b) ;
neighbours_matrix[station_b].emplace_back(station_a) ;
}
auto compute_distance = [&](int i, int j)
{
if (i==j)
return -1;
if (std::find(neighbours_matrix[i].begin(), neighbours_matrix[i].end(), j) == neighbours_matrix[i].end() )
return -1;
return 1;
};
auto neighbours = [&](int i)
{
return neighbours_matrix[i];
};
std::cout << dijkstra(nb_max_station, station_depart, compute_distance, neighbours) << std::endl;
}