比赛 2025暑期集训第8场 评测结果 AAAAAA
题目名称 狼抓兔子 最终得分 100
用户昵称 hsl_beat 运行时间 0.451 s
代码语言 C++ 内存使用 15.57 MiB
提交时间 2025-08-13 11:34:36
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct wGraph 
{
    int _n;
    vector<vector<pair<int, int>>> _edges;
    explicit wGraph(int __n) : _n(__n) {
        _edges.resize(__n + 1, {});
    }
    void addedge(int _u, int _v, int _w) {
        _edges[_u].push_back({_v, _w});
    }
    vector<int> dijkstra(int _s) { 
        vector<int> _res(_n + 1, INT_MAX);
        _res[_s] = 0;   
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> _pq; 
        _pq.push({0, _s});
        while (!_pq.empty()) { 
            int _d = _pq.top().first;
            int _u = _pq.top().second;
            _pq.pop();
            if (_d > _res[_u]) {
                continue;
            }
            for (auto _tp : _edges[_u]) { 
                int _v = _tp.first;
                int _w = _tp.second;
                if (_res[_v] > _res[_u] + _w) {
                    _res[_v] = _res[_u] + _w;
                    _pq.push({_res[_v], _v});
                }
            }
        }
        return _res;
    }
};
signed main()
{
    freopen("bjrabbit.in", "r", stdin);
    freopen("bjrabbit.out", "w", stdout);
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n, m;
    cin >> n >> m;
    wGraph g(2 * n * m);
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j < m; ++j) {
            int tp;
            cin >> tp;
            g.addedge(i == 1 ? 0 : (2 * (i - 2) * (m - 1) + 2 * j - 1), i == n ? (2 * (n - 1) * (m - 1) + 1) : (2 * (i - 1) * (m - 1) + 2 * j), tp);
            g.addedge(i == n ? (2 * (n - 1) * (m - 1) + 1) : (2 * (i - 1) * (m - 1) + 2 * j), i == 1 ? 0 : (2 * (i - 2) * (m - 1) + 2 * j - 1), tp);
        }
    for (int i = 1; i < n; ++i) {
        for (int j = 1; j <= m; ++j) {
            int tp;
            cin >> tp;
            g.addedge(j == 1 ? (2 * (n - 1) * (m - 1) + 1) : (2 * (i - 1) * (m - 1) + 2 * (j - 1)), j == m ? 0 : (2 * (i - 1) * (m - 1) + 2 * j - 1), tp);
            g.addedge(j == m ? 0 : (2 * (i - 1) * (m - 1) + 2 * j - 1), j == 1 ? (2 * (n - 1) * (m - 1) + 1) : (2 * (i - 1) * (m - 1) + 2 * (j - 1)), tp);
        }
    }
    for (int i = 1; i < n; i++) {
        for (int j = 1; j < m; ++j) {
            int tp;
            cin >> tp;
            int ttp = 2 * (i - 1) * (m - 1) + 2 * j - 1;
            g.addedge(ttp, ttp + 1, tp);
            g.addedge(ttp + 1, ttp, tp);
        }
    }
    cout << g.dijkstra(0)[2 * (n - 1) * (m - 1) + 1];
    return 0;
}