Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Graph_lab2.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #include <vector>
- #include <iostream>
- #include <set>
- #include <algorithm>
- using namespace std;
- // Деикстра
- int main()
- {
- int n, m;
- int s, f;
- freopen("input.txt", "rt", stdin);
- freopen("output.txt", "wt", stdout);
- cin >> n >> m;
- cin >> s >> f;
- s -= 1;
- f -= 1;
- vector < vector < pair<int, int> > > graph(n);
- for (int i = 0; i < m; i++) {
- int a, b, c;
- cin >> a >> b >> c;
- graph[a - 1].push_back(make_pair(b - 1, c));
- graph[b - 1].push_back(make_pair(a - 1, c));
- }
- vector<int> d(n, INT32_MAX);
- vector<int> p(n);
- // начальная
- d[s] = 0;
- vector<int> u(n);
- for (int i = 0; i < n; ++i) {
- // индекс минимальной вершины
- int v = -1;
- for (int j = 0; j < n; ++j) {
- if (!u[j] && (v == -1 || d[j] < d[v])) {
- v = j;
- }
- }
- if (d[v] == INT32_MAX) {
- break;
- }
- u[v] = true;
- for (size_t j = 0; j < graph[v].size(); ++j) {
- int to = graph[v][j].first;
- int len = graph[v][j].second;
- if (d[v] + len < d[to]) {
- d[to] = d[v] + len;
- p[to] = v;
- }
- }
- }
- if (!u[f]) {
- cout << "-1";
- return 0;
- }
- vector<int> path;
- for (int v = f; v != s; v = p[v]) {
- path.push_back(v);
- }
- path.push_back(s);
- reverse(path.begin(), path.end());
- cout << d[f] << endl;
- for (int i = 0; i < path.size(); i++)
- {
- cout << path[i] + 1 << " ";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement