# 2642. Design Graph With Shortest Path Calculator
## 想法
使用Floyd-Warshall algorithm
## 程式碼
```cpp=
#define ll long long
#define inf (ll)1e15
class Graph {
public:
vector <vector<ll>> dis;
int n;
Graph(int n, vector<vector<int>>& edges) {
this -> n = n;
dis.resize(n, vector<ll>(n, inf));
for (int i = 0; i < n; i++) {
dis[i][i] = 0;
}
for (int i = 0; i < edges.size(); i++) {
int u = edges[i][0], v = edges[i][1], w = edges[i][2];
dis[u][v] = w;
}
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
}
void addEdge(vector<int> edge) {
int u = edge[0], v = edge[1], w = edge[2];
if (w >= dis[u][v]) return;
dis[u][v] = w;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dis[i][j] = min(dis[i][j], dis[i][u] + w + dis[v][j]);
}
}
}
int shortestPath(int node1, int node2) {
if (dis[node1][node2] == inf) return -1;
return dis[node1][node2];
}
};
/**
* Your Graph object will be instantiated and called as such:
* Graph* obj = new Graph(n, edges);
* obj->addEdge(edge);
* int param_2 = obj->shortestPath(node1,node2);
*/
```
## 想法
使用 Dijkstra's algorithm
## 程式碼
```cpp=
#define oo 1e9
class Graph {
public:
vector<vector<pair<int,int>>> adj;
int n;
Graph(int n, vector<vector<int>>& edges) {
this->n = n;
adj.resize(n);
for (int i = 0; i < edges.size(); i++) {
int u = edges[i][0], v = edges[i][1], w = edges[i][2];
adj[u].push_back({v, w});
}
}
void addEdge(vector<int> edge) {
int u = edge[0], v = edge[1], w = edge[2];
adj[u].push_back({v, w});
}
int shortestPath(int node1, int node2) {
priority_queue<pair<int,int>, vector<pair<int,int>>, greater<pair<int,int>>> pq;
vector<int> dis(n, oo);
vector<bool> done(n);
dis[node1] = 0;
pq.push({0, node1});
while (!pq.empty()) {
auto [step, u] = pq.top();
pq.pop();
if (done[u]) continue;
done[u] = 1;
for (auto [v, w] : adj[u]) {
if (step + w < dis[v]) {
dis[v] = step + w;
pq.push({dis[v], v});
}
}
}
for (int i = 0; i < n; i++) {
if (dis[i] == oo) {
dis[i] = -1;
}
}
return dis[node2];
}
};
/**
* Your Graph object will be instantiated and called as such:
* Graph* obj = new Graph(n, edges);
* obj->addEdge(edge);
* int param_2 = obj->shortestPath(node1,node2);
*/
```