Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <algorithm>
- #include <vector>
- #include <set>
- #include <map>
- #include <string>
- #include <utility>
- #include <cstring>
- #include <cassert>
- #include <cmath>
- #include <stack>
- #include <queue>
- #include<complex>
- using namespace std;
- const int inf = 1e9;
- int main() {
- int n, m;
- cin >> n;
- vector < vector < int > > g(n, vector < int >(n, 0));
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- cin >> g[i][j];
- }
- }
- int start, finish;
- cin >> start >> finish;
- start--;
- finish--;
- vector < int > dist(n, inf);
- dist[start] = 0;
- int min_dist = 0;
- int min_v = start;
- vector < bool > used(n, false);
- vector < int > prev(n, -1);
- while (min_dist < inf) {
- int v = min_v;
- used[v] = true;
- for (int i = 0; i < g[v].size(); i++) {
- int x = i;
- if (i == v || g[v][i] == 0) {
- continue;
- }
- int cost = g[v][i];
- if (dist[v] + cost < dist[x]) {
- prev[x] = v;
- dist[x] = dist[v] + cost;
- }
- }
- min_dist = inf;
- for (int i = 0; i < n; i++) {
- if (!used[i] && dist[i] < min_dist) {
- min_dist = dist[i];
- min_v = i;
- }
- }
- }
- cout << dist[finish] << endl;
- vector < int > ans;
- int t = finish;
- while (prev[t] != -1) {
- ans.push_back(t);
- t = prev[t];
- }
- cout << start + 1 << " ";
- reverse(ans.begin(), ans.end());
- for (int i = 0; i < ans.size(); i++) {
- cout << ans[i] + 1 << " ";
- }
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement