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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| #include <bits/stdc++.h>
using namespace std;
using pii = pair<int, int>;
class Graph { public: int n; vector<pii>* adj;
Graph(int n) { this->n = n; adj = new vector<pii>[n]; }
void insertEdge(int u, int v, int w) { this->adj[u].push_back(make_pair(v, w)); this->adj[v].push_back(make_pair(u, w)); } };
vector<vector<int>>* floyd(Graph* g) { vector<vector<int>> A(g->n, vector<int>(g->n, INT_MAX));
vector<vector<int>>* next = new vector<vector<int>>(g->n, vector<int>(g->n));
for (int i = 0; i < g->n; i++) { A[i][i] = 0;
for (pii a : g->adj[i]) { A[i][a.first] = a.second; (*next)[i][a.first] = a.first; } }
for (int k = 0; k < g->n; k++) { for (int i = 0; i < g->n; i++) { for (int j = 0; j < g->n; j++) { if (A[i][k] == INT_MAX || A[k][j] == INT_MAX) { continue; }
if (A[i][k] + A[k][j] < A[i][j]) { A[i][j] = A[i][k] + A[k][j];
(*next)[i][j] = (*next)[i][k]; } } } }
return next; }
void trace_path(int u, int v, vector<vector<int>>* next) { if (u != v) { u = (*next)[u][v]; cout << " -> " << u; trace_path(u, v, next); }
}
void print_path(int u, int v, vector<vector<int>>* next) { cout << u; trace_path(u, v, next); }
int main(void) { Graph* g = new Graph(7); g->insertEdge(0, 1, 7); g->insertEdge(1, 0, 7); g->insertEdge(0, 4, 3); g->insertEdge(4, 0, 3); g->insertEdge(0, 5, 10); g->insertEdge(5, 0, 10); g->insertEdge(1, 4, 2); g->insertEdge(4, 1, 2); g->insertEdge(1, 5, 6); g->insertEdge(5, 1, 6); g->insertEdge(1, 2, 4); g->insertEdge(2, 1, 4); g->insertEdge(1, 3, 10); g->insertEdge(3, 1, 10); g->insertEdge(2, 3, 2); g->insertEdge(3, 2, 2); g->insertEdge(4, 3, 11); g->insertEdge(3, 4, 11); g->insertEdge(4, 6, 5); g->insertEdge(6, 4, 5); g->insertEdge(6, 3, 4); g->insertEdge(3, 6, 4); g->insertEdge(3, 5, 9); g->insertEdge(5, 3, 9);
auto next = floyd(g);
for (int i = 0; i < g->n; i++) { for (int j = 0; j < g->n; j++) { cout << "["<< i << " -> " << j << "] : "; print_path(i, j, next); cout << "\n"; } cout << "\n"; }
return 0; }
|