记录编号 |
411041 |
评测结果 |
AAAAAA |
题目名称 |
[BJOI2006] 狼抓兔子 |
最终得分 |
100 |
用户昵称 |
kZime |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.277 s |
提交时间 |
2017-06-03 16:14:11 |
内存使用 |
78.81 MiB |
显示代码纯文本
- # include <bits/stdc++.h>
- # define INF 0x7fffffff
- # define MAXN 2001000
- using namespace std;
-
- char buf[1 << 18], *fs, *ft;
- inline char getc() {
- return (fs == ft && (ft = (fs = buf) + fread(buf, 1, 1 << 18, stdin)), fs == ft) ? EOF : *fs++;
- }
-
- inline int gn() {
- int k = 0, f = 1;
- char c = getc();
- for(; !isdigit(c); c = getc()) if(c == '-') f = -1;
- for(; isdigit(c); c = getc()) k = k * 10 + c - '0';
- return k * f;
- }
-
- struct edge {
- int to, w;
- edge *ne;
- inline edge() {
- to = 0, w = 0, ne = NULL;
- }
- inline edge(int to_, int w_, edge *ne_) {
- to = to_;
- w = w_;
- ne = ne_;
- }
- }*head[MAXN];
-
- inline void addedge(int fr, int to, int w) {
- head[fr] = new edge(to, w, head[fr]);
- head[to] = new edge(fr, w, head[to]);
- }
-
- int n, m, ans, S, T, dis[MAXN], q[MAXN << 3];
- bool inq[MAXN];
-
- void build(){
- S=0,T=((n-1)*(m-1))<<1|1;
- for (int i=1; i<=n; i++)
- for (int j=1; j<m; j++){
- int x=gn(),u,v;
- if (i==1) u=S,v=j;
- else if (i==n) u=((i-2)<<1|1)*(m-1)+j,v=T;
- else u=((i-2)<<1|1)*(m-1)+j,v=((i-1)<<1)*(m-1)+j;
- addedge(u, v, x);
- }
- for (int i=1; i<n; i++)
- for (int j=1; j<=m; j++){
- int x=gn(),u,v;
- if (j==1) u=((i-1)<<1|1)*(m-1)+1,v=T;
- else if (j==m) u=S,v=((i-1)<<1|1)*(m-1);
- else u=((i-1)<<1)*(m-1)+j-1,v=((i-1)<<1|1)*(m-1)+j;
- addedge(u, v, x);
- }
- for (int i=1; i<n; i++)
- for (int j=1; j<m; j++){
- int x=gn(),u,v;
- u=((i-1)<<1)*(m-1)+j,v=((i-1)<<1|1)*(m-1)+j;
- addedge(u, v, x);
- }
- }
-
- inline int spfa() {
- int l = 1, r = 1;
- memset(dis, 42, sizeof(dis));
- dis[S] = 0;
- inq[S] = 1;
- q[1] = S;
- while(l <= r) {
- int u = q[l++];
- inq[u] = 0;
- for(edge *e = head[u]; e; e = e->ne) {
- if(dis[e->to] > dis[u] + e->w) {
- dis[e->to] = dis[u] + e->w;
- if(!inq[e->to]) inq[e->to] = 1, q[++r] = e->to;
- }
- }
- }
- return dis[T];
- }
-
- inline void solve() {
- if(n == 1 || m == 1) {
- if(n > m) swap(n, m);
- ans = INF;
- for(int i = 1; i < m; i++) ans = min(gn(), ans);
- if(ans == INF) ans = 0;
- printf("%d\n", ans);
- } else {
- build();
- printf("%d\n", spfa());
- }
- }
-
- int main() {
- # ifdef LOCAL
- freopen("in", "r", stdin);
- # else
- freopen("bjrabbit.in", "r", stdin);
- freopen("bjrabbit.out", "w", stdout);
- # endif
- n = gn();
- m = gn();
- solve();
- return 0;
- }
-