Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- #include <limits>
- using namespace std;
- const int INF = numeric_limits<int>::max();
- const int MAX_Q = 300;
- int graph[MAX_Q][MAX_Q];
- int dist[MAX_Q];
- bool visited[MAX_Q];
- void dijkstra(int start, int Q) {
- for (int i = 0; i < Q; ++i) {
- dist[i] = INF;
- }
- memset(visited, false, sizeof(visited));
- dist[start] = 0;
- for (int i = 0; i < Q; ++i) {
- int u = -1;
- for (int j = 0; j < Q; ++j) {
- if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
- u = j;
- }
- }
- if (dist[u] == INF) break;
- visited[u] = true;
- for (int v = 0; v < Q; ++v) {
- if (graph[u][v] != INF && dist[u] + graph[u][v] < dist[v]) {
- dist[v] = dist[u] + graph[u][v];
- }
- }
- }
- }
- int main() {
- int Q, R, N;
- cin >> Q >> R >> N;
- for (int i = 0; i < Q; ++i) {
- for (int j = 0; j < Q; ++j) {
- graph[i][j] = (i == j) ? 0 : INF;
- }
- }
- for (int i = 0; i < R; ++i) {
- int A, B, M;
- cin >> A >> B >> M;
- graph[A][B] = M;
- }
- for (int i = 0; i < N; ++i) {
- int type;
- cin >> type;
- if (type == 1) {
- int A, B, M;
- cin >> A >> B >> M;
- graph[A][B] = M;
- } else if (type == 2) {
- int A, B;
- cin >> A >> B;
- dijkstra(A, Q);
- if (dist[B] == INF) {
- cout << -1 << endl;
- } else {
- cout << dist[B] << endl;
- }
- }
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment