Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include<vector>
- #include<algorithm>
- #include <iomanip>
- using namespace std;
- vector<vector<pair<int, int>>> G;
- vector<int> used;
- vector<int> dist;
- vector<int> parents;
- int n;
- void dkstr(int v) {
- dist[v] = 0;
- for (int i = 0; i < n; i++) {
- //поиск минимума
- int min_v = -1;
- int min_dist = 1000000000;
- for (int i = 0; i < n; i++) {
- if (used[i] == 0 && dist[i] < min_dist) {
- min_v = i;
- min_dist = dist[i];
- }
- }
- if (min_v == -1) {
- return;
- }
- //релаксация
- used[min_v] = 1;
- for (int i = 0; i < G[min_v].size(); i++) {
- int actual_v = G[min_v][i].first;
- int weight = G[min_v][i].second;
- if (used[actual_v] == 0 && dist[actual_v] > min_dist + weight) {
- dist[actual_v] = min_dist + weight;
- parents[actual_v] = min_v;
- }
- }
- }
- }
- int main() {
- int s, f;
- cin >> n >> s >> f;
- s -= 1;
- f -= 1;
- G = vector<vector<pair<int, int>>>(n);
- used = vector<int>(n);
- dist = vector<int>(n, 1000000000);
- parents = vector<int>(n, -1);
- //ввод данных
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- int a;
- cin >> a;
- if (a != 0 && a != -1) {
- G[i].push_back(make_pair(j, a));
- }
- }
- }
- dkstr(s);
- if (used[f] == 0) {
- cout << -1;
- } else {
- // f - > s
- vector<int> ans;
- while (f != -1){
- ans.push_back(f);
- f = parents[f];
- }
- for (int i = ans.size() - 1; i >= 0; i--){
- cout << ans[i] + 1 << ' ';
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment