1. 程式人生 > >[BZOJ1001][BeiJing2006]狼抓兔子 && 平面網路流

[BZOJ1001][BeiJing2006]狼抓兔子 && 平面網路流

傳說這個題可以轉最短路

於是我去轉最短路

於是搞的我無比糾結 連邊麻煩的要死

#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]);
}