|
2 | 2 | using namespace std;
|
3 | 3 |
|
4 | 4 | // numarul maxim de noduri
|
5 |
| -#define NMAX 105 |
| 5 | +#define NMAX 50005 |
| 6 | + |
| 7 | +// valoare mai mare decat orice distanta din graf |
| 8 | +#define INF (1 << 30) |
6 | 9 |
|
7 | 10 | class Task {
|
8 | 11 | public:
|
9 | 12 | void solve() {
|
10 | 13 | read_input();
|
11 |
| - compute(); |
12 |
| - print_output(); |
| 14 | + print_output(get_result()); |
13 | 15 | }
|
14 | 16 |
|
15 | 17 | private:
|
16 |
| - // n = numar de noduri |
17 |
| - int n; |
18 |
| - |
19 |
| - // w[x]y] = costul muchiei de la x la y: (x, y, w[x][y]) |
20 |
| - // (w[x][y] = 0 - muchia lipseste) |
21 |
| - int w[NMAX][NMAX]; |
22 |
| - |
23 |
| - // d[x][y] = lungimea drumului minim de la x la y |
24 |
| - int d[NMAX][NMAX]; |
| 18 | + // n = numar de noduri, m = numar de muchii |
| 19 | + int n, m; |
| 20 | + // adj[x] = lista de adiacenta a nodului x |
| 21 | + // perechea (y, w) semnifica muchie de la x la y de cost w: (x, y, w) |
| 22 | + vector<pair<int, int>> adj[NMAX]; |
| 23 | + // nodul sursa |
| 24 | + int source; |
25 | 25 |
|
26 | 26 | void read_input() {
|
27 | 27 | ifstream fin("in");
|
28 |
| - fin >> n; |
29 |
| - for (int x = 1; x <= n; x++) { |
30 |
| - for (int y = 1; y <= n; y++) { |
31 |
| - fin >> w[x][y]; |
32 |
| - } |
| 28 | + fin >> n >> m >> source; |
| 29 | + for (int i = 1, x, y, w; i <= m; i++) { |
| 30 | + fin >> x >> y >> w; |
| 31 | + adj[x].push_back({y, w}); |
33 | 32 | }
|
34 | 33 | fin.close();
|
35 | 34 | }
|
36 | 35 |
|
37 |
| - void compute() { |
| 36 | + vector<int> get_result() { |
38 | 37 | //
|
39 |
| - // TODO: Gasiti distantele minime intre oricare doua noduri, folosind Roy-Floyd |
40 |
| - // pe graful orientat cu n noduri, m arce stocat in matricea ponderilor w |
41 |
| - // (declarata mai sus). |
| 38 | + // TODO: Gasiti distantele minime de la nodul source la celelalte noduri |
| 39 | + // folosind Bellman-Ford pe graful orientat cu n noduri, m arce stocat in adj. |
| 40 | + // d[node] = costul minim / lungimea minima a unui drum de la source la nodul |
| 41 | + // node; |
| 42 | + // d[source] = 0; |
| 43 | + // d[node] = -1, daca nu se poate ajunge de la source la node. |
42 | 44 | //
|
43 | 45 | // Atentie:
|
44 |
| - // O muchie (x, y, w[x][y]) este reprezentata astfel in matricea ponderilor: |
45 |
| - // w[x][y] este costul muchiei de la x la y |
46 |
| - // Daca nu exista o muchie intre doua noduri x si y, in matricea ponderilor: |
47 |
| - // w[x][y] = 0; |
| 46 | + // O muchie este tinuta ca o pereche (nod adiacent, cost muchie): |
| 47 | + // adj[x][i] == (y, w) - unde y este al i-lea vecin al lui x, iar (x, y) are cost w: (x, y, w) |
48 | 48 | //
|
49 |
| - // Trebuie sa populati matricea d[][] (declarata mai sus): |
50 |
| - // d[x][y] = distanta minima intre nodurile x si y, daca exista drum. |
51 |
| - // d[x][y] = 0 daca nu exista drum intre x si y. |
52 |
| - // * implicit: d[x][x] = 0 (distanta de la un nod la el insusi). |
| 49 | + // In cazul in care exista ciclu de cost negativ, returnati un vector gol: |
| 50 | + // return {}; |
53 | 51 | //
|
| 52 | + |
| 53 | + vector<int> d(n + 1, 0); |
| 54 | + return d; |
54 | 55 | }
|
55 | 56 |
|
56 |
| - void print_output() { |
| 57 | + void print_output(vector<int> result) { |
57 | 58 | ofstream fout("out");
|
58 |
| - for (int x = 1; x <= n; x++) { |
59 |
| - for (int y = 1; y <= n; y++) { |
60 |
| - fout << d[x][y] << ' '; |
| 59 | + if (result.size() == 0) { |
| 60 | + fout << "Ciclu negativ!\n"; |
| 61 | + } else { |
| 62 | + for (int i = 1; i <= n; i++) { |
| 63 | + fout << result[i] << ' '; |
61 | 64 | }
|
62 | 65 | fout << '\n';
|
63 | 66 | }
|
|
0 commit comments