Advertisement
Hippskill

Untitled

Jan 27th, 2016
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include<stdio.h>
  3. #include<iostream>
  4. #include<vector>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<map>
  8. #include<set>
  9. #include<sstream>
  10. #include<cstring>
  11. #include<numeric>
  12. #include<limits.h>
  13. using namespace std;
  14.  
  15. const int N = 505;
  16.  
  17. vector<pair<int, long long> > g[N * N + 1];
  18. int n, m;
  19. long long res = LLONG_MAX;
  20. long long ans[N * N + 1];
  21. long long d[N * N + 1];
  22. long long a[N][N];
  23. int p[N * N + 1];
  24. int id = 0;
  25.  
  26. int index(int x, int y) {
  27.     return x * m + y + 1;
  28. }
  29.  
  30. void dijkstra(int s) {
  31.     fill_n(d, N * N + 1, LLONG_MAX);
  32.     fill_n(p, N * N + 1, -1);
  33.     d[s] = 0LL;
  34.     set < pair<long long, int> > q;
  35.     q.insert(make_pair(d[s], s));
  36.     while (!q.empty()) {
  37.         int v = q.begin()->second;
  38.         q.erase(q.begin());
  39.         for (int j = 0; j < g[v].size(); j++) {
  40.             int to = g[v][j].first;
  41.             long long len = g[v][j].second;
  42.             if (d[v] + len < d[to]) {
  43.                 q.erase(make_pair(d[to], to));
  44.                 d[to] = d[v] + len;
  45.                 p[to] = v;
  46.                 q.insert(make_pair(d[to], to));
  47.             }
  48.         }
  49.     }
  50.     for (int i = 0; i < m; i++) {
  51.         int ind = index(n - 1, i);
  52.         if (d[ind] + a[(ind - 1) / m][(ind - 1) % m] < res) {
  53.             res = d[ind] + a[(ind - 1) / m][(ind - 1) % m];
  54.             id = 0;
  55.             for (int c = ind; c != s; c = p[c], id++) {
  56.                 ans[id] = (c - 1) % m + 1;
  57.             }
  58.         }
  59.     }
  60. }
  61.  
  62.  
  63. int main() {
  64. #ifndef ONLINE_JUDGE
  65.     freopen("input.txt", "r", stdin);
  66. #endif
  67.  
  68.     scanf("%d%d", &n, &m);
  69.  
  70.     for (int i = 0; i < n; i++) {
  71.         for (int j = 0; j < m; j++) {
  72.             scanf("%ld", &a[i][j]);
  73.         }
  74.     }
  75.     for (int i = 0; i < n; i++) {
  76.         for (int j = 0; j < m; j++) {
  77.             if (j - 1 >= 0) {
  78.                 g[index(i, j)].push_back(make_pair(index(i, j - 1), a[i][j]));
  79.             }
  80.             if (j + 1 < m) {
  81.                 g[index(i, j)].push_back(make_pair(index(i, j + 1), a[i][j]));
  82.             }
  83.             if (i + 1 < n) {
  84.                 g[index(i, j)].push_back(make_pair(index(i + 1, j), a[i][j]));
  85.             }
  86.         }
  87.     }
  88.     for (int i = 1; i <= m; i++) {
  89.         g[0].push_back(make_pair(i, 0));
  90.     }
  91.     dijkstra(0);
  92.     //printf("%d\n", res);
  93.     for (int i = id - 1; i >= 0; i--) {
  94.         printf("%d ", ans[i]);
  95.     }
  96.  
  97.     return 0;
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement