BZOJ1001 狼抓兔子 终于过了!

时间来不及了,先贴代码吧!有时间再写。

好苦逼啊,WA了若干次,还有一次RE,一次TLE。

虽然主要运用的算法和资料都由师兄提供了。还是太弱了,太天真了。

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<queue>
  4 #include<cstring>
  5 #define maxn 2100009
  6 #define rep(i,j,k) for(int i = j; i <= k; i++)
  7 using namespace std;
  8
  9 int read()
 10 {
 11     int s = 0, t = 1; char c = getchar();
 12     while( !isdigit(c) ) {
 13         if( c == ‘-‘ ) t = -1; c = getchar();
 14     }
 15     while( isdigit(c) ){
 16         s = s * 10 + c - ‘0‘; c = getchar();
 17     }
 18     return s * t;
 19 }
 20
 21 int d[maxn], n, m, sx, tx;
 22 bool done[maxn] = {0};
 23
 24 struct node{
 25 int d, u;
 26 bool operator < (const node& rhs) const{
 27         return d > rhs.d;
 28      }
 29 };
 30
 31 struct edge{
 32 int to, key;
 33 edge* next;
 34 };
 35
 36 edge *pt, edges[maxn*3], *head[maxn];
 37
 38 void add_edge(int x,int y,int val){
 39    pt->to = y;pt->key = val;
 40    pt->next = head[x];
 41    head[x] = pt++;
 42    pt->to = x, pt->key= val;
 43    pt->next = head[y];
 44    head[y] = pt++;
 45 }
 46 priority_queue<node> Q;
 47
 48 void dijkstra()
 49 {
 50      memset(d,127,sizeof(d));
 51      d[sx] = 0;
 52      Q.push((node){0,sx});
 53      while( !Q.empty() ){
 54         node x = Q.top(); Q.pop();
 55         int u = x.u;
 56         if( done[u] ) continue;
 57         done[u] = 1;
 58         for( edge*i = head[u]; i ; i = i->next ){
 59             int y = i->to, key = i->key;
 60             if( d[y] > d[u]+key ) {
 61                 d[y] = d[u]+key;
 62                 Q.push((node){d[y],y});
 63             }
 64         }
 65      }
 66 }
 67
 68 int main()
 69 {
 70     //freopen("out.txt","w",stdout);
 71    pt = edges;
 72    n = read(), m = read();
 73    sx = 0, tx = (n-1)*(m-1) * 2+ 1;
 74    rep(i,0,n-1) {
 75       int xx = (2*m-2)*i;
 76       int xy = (2*m-2)*(i-1);
 77       rep(j,1,m-1){
 78          int x = read();
 79          if( !i ) {
 80             add_edge(xx+2*j,tx,x);
 81             //cout<<tx<<" "<<xx+2*j+1<<" "<<x<<endl;
 82          }
 83          else if( i == n-1 ) {
 84             add_edge(sx,xy+2*j-1,x);
 85             //cout<<xy+2*j<<" "<<sx<<" "<<x<<endl;
 86          }
 87          else{
 88             add_edge(xx+2*j,xy+2*j-1,x);
 89             //cout<<xy+2*j<<" "<<xx+2*j+1<<" "<<x<<endl;
 90          }
 91       }
 92    }
 93    rep(i,0,n-2){
 94       int xx = 2*(m-1)*(i);
 95       rep(j,1,m){
 96          int x = read();
 97          if( j == 1 ){
 98             add_edge(sx,xx+2*j-1,x);
 99             //cout<<sx<<" "<<xx<<" "<<x<<endl;
100          }
101          else if( j == m ){
102             add_edge(tx,xx+2*j-2,x);
103             //cout<<tx<<" "<<xx+2*j-1<<" "<<x<<endl;
104          }
105          else {
106             add_edge(xx+2*j-2,xx+2*j-1,x);
107             //cout<<xx+2*j<<" "<<xx+2*j-1<<" "<<x<<endl;
108          }
109       }
110    }
111    rep(i,0,n-2){
112      int xx = 2*(m-1)*(i);
113      rep(j,1,m-1){
114         int x = read();
115         add_edge(xx+2*j,xx+2*j-1,x);
116         //cout<<xx+2*j<<" "<<xx+2*j+1<<" "<<endl;
117      }
118    }
119    dijkstra();
120    cout<<d[tx]<<endl;
121    return 0;
122 }
时间: 2024-10-24 20:04:20

BZOJ1001 狼抓兔子 终于过了!的相关文章

[BJOI2006] [BZOJ1001] 狼抓兔子

现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的. 左上角和右下角

【建图+最短路】Bzoj1001 狼抓兔子

Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路是

bzoj1001狼抓兔子

这题就一个裸的网络流吧,其实也可以用最短路. 主要就是建边的时候注意一下,其他就没有了. 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <queue> 5 using namespace std; 6 const int N=1000010; 7 const int inf=1e9+7; 8 struct edge { 9 int v,next,c,f; 1

bzoj1001 狼抓兔子

这道题 我只会最大流写法 加了当前弧优化就过了 只看代码就oaky了 相信各位大佬都懂的 不过这道题反向弧和反向边可以弄在一起 会快很多 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=1000005,inf=0x3f3f3f3f; 6 int n,m,sum=1,S,T; 7 long long ans; 8 int

[日常摸鱼]bzoj1001狼抓兔子-最大流最小割

题意就是求最小割- 然后我们有这么一个定理(最大流-最小割定理 ): 任何一个网络图的最小割中边的容量之和等于图的最大流. (下面直接简称为最大流和最小割) 证明: 如果最大流>最小割,那把这些割边删去之后依然能找到一条增广路使得源点和汇点联通,和这些边是最小割矛盾.故最大流$\leq$最小割. 而如果最大流<最小割,可是这样通过这些割边还能有更大的流,和最大流矛盾. 综上,最大流=最小割~ 然后看看这道题-哇$n\leq 1000$,百万个点百万条边-好吧Dinic其实跑得过-而且还蛮快的-

[BJOI2006][bzoj1001] 狼抓兔子 [最小割]

题面: 传送门 思路: 其实就是一道最小割的题目...... 我的写法加了两个优化,常数比较小,所以过掉了 一个是当前弧,一个是若当前点并不能流出去,那么标记dep为-1 听说正解是对偶图最短路?可以找时间学一学...... Code: #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define inf 1e9 #define id(i,j) (i-1)*

bzoj1001 [BeiJing2006]狼抓兔子

1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 23723  Solved: 5981[Submit][Status][Discuss] Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M

【bzoj1001】【狼抓兔子】

1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 12719 Solved: 3017 [Submit][Status][Discuss] Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=

BZOJ1001: [BeiJing2006]狼抓兔子【最短路】

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 27684  Solved: 7127 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的