Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _USE_MATH_DEFINES
- #include<stdio.h>
- #include<iostream>
- #include<vector>
- #include<cmath>
- #include<algorithm>
- #include<map>
- #include<set>
- #include<sstream>
- #include<cstring>
- #include<numeric>
- #include<limits.h>
- using namespace std;
- const int N = 505;
- vector<pair<int, long long> > g[N * N + 1];
- int n, m;
- long long res = LLONG_MAX;
- long long ans[N * N + 1];
- long long d[N * N + 1];
- long long a[N][N];
- int p[N * N + 1];
- int id = 0;
- int index(int x, int y) {
- return x * m + y + 1;
- }
- void dijkstra(int s) {
- fill_n(d, N * N + 1, LLONG_MAX);
- fill_n(p, N * N + 1, -1);
- d[s] = 0LL;
- set < pair<long long, int> > q;
- q.insert(make_pair(d[s], s));
- while (!q.empty()) {
- int v = q.begin()->second;
- q.erase(q.begin());
- for (int j = 0; j < g[v].size(); j++) {
- int to = g[v][j].first;
- long long len = g[v][j].second;
- if (d[v] + len < d[to]) {
- q.erase(make_pair(d[to], to));
- d[to] = d[v] + len;
- p[to] = v;
- q.insert(make_pair(d[to], to));
- }
- }
- }
- for (int i = 0; i < m; i++) {
- int ind = index(n - 1, i);
- if (d[ind] + a[(ind - 1) / m][(ind - 1) % m] < res) {
- res = d[ind] + a[(ind - 1) / m][(ind - 1) % m];
- id = 0;
- for (int c = ind; c != s; c = p[c], id++) {
- ans[id] = (c - 1) % m + 1;
- }
- }
- }
- }
- int main() {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- #endif
- scanf("%d%d", &n, &m);
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- scanf("%ld", &a[i][j]);
- }
- }
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- if (j - 1 >= 0) {
- g[index(i, j)].push_back(make_pair(index(i, j - 1), a[i][j]));
- }
- if (j + 1 < m) {
- g[index(i, j)].push_back(make_pair(index(i, j + 1), a[i][j]));
- }
- if (i + 1 < n) {
- g[index(i, j)].push_back(make_pair(index(i + 1, j), a[i][j]));
- }
- }
- }
- for (int i = 1; i <= m; i++) {
- g[0].push_back(make_pair(i, 0));
- }
- dijkstra(0);
- //printf("%d\n", res);
- for (int i = id - 1; i >= 0; i--) {
- printf("%d ", ans[i]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement