传说这个题可以转最短路
于是我去转最短路
于是搞的我无比纠结 连边麻烦的要死
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#include<deque>
#define SF scanf
#define PF printf
using namespace std;
typedef long long LL;
const int MAXN = 2000000;
int N, M, n, m, S, T;
int d[MAXN+10];
bool vis[MAXN+10];
deque <int> q;
struct Node {
int v, wt;
Node () {}
Node (int a, int b) : v(a), wt(b) {}
} ;
vector <Node> G[MAXN+10];
void add(int u, int v, int wt) {
G[u].push_back(Node(v, wt));
G[v].push_back(Node(u, wt));
}
void SPFA() {
memset(d, 0x3f, sizeof(d));
d[S] = 0; vis[S] = true; q.push_back(S);
while(!q.empty()) {
int u = q.front(); q.pop_front();
vis[u] = false;
for(int i = 0; i < G[u].size(); i++) {
int v = G[u][i].v, wt = G[u][i].wt;
if(d[v] > d[u] + wt) {
d[v] = d[u] + wt;
if(!vis[v]) {
if(d[v] < d[q.front()]) q.push_front(v);
else q.push_back(v);
}
}
}
}
}
int main() {
SF("%d%d", &n, &m);
N = n-1; M = m-1;
S = 2*N*M+1; T = S+1;
for(int i = 1; i <= n; i++)
for(int j = 1; j < m; j++) {
int x, u, v;
SF("%d", &x);
int base = (i-1) * M + j;
v = base << 1; u = v - (M<<1) - 1;
if(i == 1) u = S;
else if(i == n) v = T;
add(u, v, x);
}
for(int i = 1; i < n; i++)
for(int j = 1; j <= m; j++) {
int x, u, v;
SF("%d", &x);
int base = (i-1) * M + j - 1;
u = base << 1; v = u | 1;
if(j == 1) u = T;
else if (j == m) v = S;
add(u, v, x);
}
for(int i = 1; i < n; i++)
for(int j = 1; j < m; j++) {
int x, u, v;
SF("%d", &x);
int base = (i-1) * M + j;
v = base << 1;
u = v - 1;
add(u, v, x);
}
SPFA();
PF("%d\n", d[T]);
}