Advertisement
Hippskill

Untitled

Jan 27th, 2016
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 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, int> > g[N];
  18. int a[N][N];
  19. int n, m;
  20. long long res = LLONG_MAX;
  21. long long ans[N * N * 10];
  22. long long d[N * N];
  23. int p[N * N];
  24. int id = 0;
  25.  
  26. int index(int x, int y) {
  27.     return x * m + y;
  28. }
  29.  
  30. void dijkstra(int s) {
  31.     fill_n(d, N * N, LLONG_MAX);
  32.     fill_n(p, N * N, -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.                 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[index(n - 1, i)] + a[ind / m][ind % m] < res) {
  53.             res = d[index(n - 1, i)] + a[ind / m][ind % m];
  54.             id = 0;
  55.             for (int c = ind; c != -1; c = p[c], id++) {
  56.                 ans[id] = c % 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.     if (n > 100 || m > 500)
  71.         throw;
  72.  
  73.     for (int i = 0; i < n; i++) {
  74.         for (int j = 0; j < m; j++) {
  75.             scanf("%d", &a[i][j]);
  76.         }
  77.     }
  78.     for (int i = 0; i < n; i++) {
  79.         for (int j = 0; j < m; j++) {
  80.             if (j - 1 >= 0) {
  81.                 g[index(i, j)].push_back(make_pair(index(i, j - 1), a[i][j]));
  82.             }
  83.             if (j + 1 < m) {
  84.                 g[index(i, j)].push_back(make_pair(index(i, j + 1), a[i][j]));
  85.             }
  86.             if (i + 1 < n) {
  87.                 g[index(i, j)].push_back(make_pair(index(i + 1, j), a[i][j]));
  88.             }
  89.         }
  90.     }
  91.  
  92.     for (int i = 0; i < m; i++) {
  93.         dijkstra(i);
  94.     }
  95.     //printf("%d\n", res);
  96.     for (int i = id - 1; i >= 0; i--) {
  97.         printf("%d ", ans[i]);
  98.     }
  99.  
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement