Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <fstream>
- #include <iostream>
- #include <cmath>
- #include <stdio.h>
- #define inf 100000000000
- using namespace std;
- ifstream in("input.txt", ios::in);
- ofstream out("output.txt", ios::out);
- int n, m;
- long long* w;
- long long** graph;
- void gograph();
- void dijkstra(long long** graph);
- int main()
- {
- gograph();
- dijkstra(graph);
- return 0;
- }
- void gograph()
- {
- in >> n;
- w = new long long[n];
- for (int i = 0; i<n; i++)
- in >> w[i];
- w[n-1] = 0;
- graph = new long long*[n];
- for (int i = 0; i<n; i++)
- graph[i] = new long long[n];
- for (int i = 0; i<n; i++)
- for (int j = 0; j<n; j++)
- graph[i][j] = -1;
- in >> m;
- for (int i = 0; i<m; i++)
- {
- long long x, y;
- in >> x >> y;
- x--;y--;
- graph[x][y] = w[x];
- graph[y][x] = w[y];
- }
- }
- void dijkstra(long long** graph)
- {
- if (n == 1)
- {
- out << 0;
- return;
- }
- int to;
- long long len;
- bool* used = new bool[n];
- long long* d = new long long[n];
- long long* p = new long long[n];
- for (int i = 0; i<n; i++)
- {
- used[i] = false;
- d[i] = inf;
- }
- d[0] = 0;
- for (int i = 0; i<n; i++)
- {
- long long v = -1;
- for (int j = 0; j<n; j++)
- if (!used[j] && (v == -1 || d[j] < d[i]))
- v = j;
- if (d[v] == inf)
- break;
- used[v] = true;
- for (int j = 0; j<n; j++)
- {
- if (graph[v][j]>=0)
- {
- to = j;
- len = graph[v][j];
- if (d[v] + len < d[to])
- {
- d[to] = d[v] + len;
- p[to] = v;
- }
- }
- }
- }
- out << (d[n-1] != inf ? d[n-1] : -1);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement