[BZOJ1001][BeiJing2006]狼抓兔子 && 平面網路流
阿新 • • 發佈:2019-02-07
傳說這個題可以轉最短路
於是我去轉最短路
於是搞的我無比糾結 連邊麻煩的要死
#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]); }