[BJOI2006]狼抓兔子 暴力AC啦!

直接暴力建边,在lougu上跑的飞快。(except the last test)

总结一下也就是三句话:

insert(id(i, j), id(i, j + 1), x)
insert(id(i, j), id(i + 1, j), x)
insert(id(i, j), id(i + 1, j + 1), x) 

没了就,。。dinic什么的就看看本博客分享的总结爸。。。

代码当然还是要发的,即使只是一个暴力。。

  1 #include <map>
  2 #include <set>
  3 #include <cmath>
  4 #include <ctime>
  5 #include <queue>
  6 #include <stack>
  7 #include <vector>
  8 #include <bitset>
  9 #include <cstdio>
 10 #include <cctype>
 11 #include <string>
 12 #include <cstring>
 13 #include <cassert>
 14 #include <climits>
 15 #include <cstdlib>
 16 #include <iostream>
 17 #include <algorithm>
 18 #include <functional>
 19 using namespace std ;
 20
 21 #define rep(i, a, b) for (int (i) = (a); (i) <= (b); (i)++)
 22 #define Rep(i, a, b) for (int (i) = (a) - 1; (i) < (b); (i)++)
 23 #define REP(i, a, b) for (int (i) = (a); (i) >= (b); (i)--)
 24 #define clr(a) memset(a, 0, sizeof(a))
 25 #define Sort(a, len, cmp) sort(a + 1, a + len + 1, cmp)
 26 #define ass(a, sum) memset(a, sum, sizeof(a))
 27
 28 #define ls ((rt) << 1)
 29 #define rs ((rt) << 1 | 1)
 30 #define lowbit(x) (x & -x)
 31 #define mp make_pair
 32 #define pb push_back
 33 #define fi first
 34 #define se second
 35 #define endl ‘\n‘
 36 #define ENDL cout << endl
 37 #define SZ(x) ((int)x.size())
 38
 39 typedef long long ll ;
 40 typedef unsigned long long ull ;
 41 typedef vector <int> vi ;
 42 typedef pair <int, int> pii ;
 43 typedef pair <ll, ll> pll ;
 44 typedef map <int, int> mii ;
 45 typedef map <string, int> msi ;
 46 typedef map <ll, ll> mll ;
 47
 48 const int N = 1010 ;
 49 const double eps = 1e-8 ;
 50 const int iinf = INT_MAX ;
 51 const ll linf = 2e18 ;
 52 const double dinf = 1e30 ;
 53 const int MOD = 1000000007 ;
 54
 55 inline int read(){
 56     int X = 0, w = 0 ;
 57     char ch = 0 ;
 58     while (!isdigit(ch)) { w |= ch == ‘-‘ ; ch = getchar() ; }
 59     while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar() ;
 60     return w ? - X : X ;
 61 }
 62
 63 void write(int x){
 64      if (x < 0) putchar(‘-‘), x = - x ;
 65      if (x > 9) write(x / 10) ;
 66      putchar(x % 10 + ‘0‘) ;
 67 }
 68
 69 void print(int x) {
 70     cout << x << endl ;
 71     exit(0) ;
 72 }
 73
 74 void PRINT(string x) {
 75     cout << x << endl ;
 76     exit(0) ;
 77 }
 78
 79 void douout(double x){
 80      printf("%lf\n", x + 0.0000000001) ;
 81 }
 82
 83 int n, m, x, top = 1, s, t ;
 84 int head[N * N], dep[N * N] ;
 85
 86 struct Edge {
 87     int to, nxt, w ;
 88 } e[N * N * 6] ;
 89
 90 void add(int a, int b, int w) {
 91     e[++top] = (Edge) {b, head[a], w} ;
 92     head[a] = top ;
 93 }
 94
 95 void insert(int a, int b, int w) {
 96     add(a, b, w) ;
 97     add(b, a, w) ;
 98 }
 99
100 bool bfs() { //分层图
101     queue <int> q ;
102     q.push(s) ;
103     clr(dep) ;
104     dep[s] = 1 ;
105     while (!q.empty()) {
106         int now = q.front() ;
107         q.pop() ;
108         for (int i = head[now]; i; i = e[i].nxt) {
109             int to = e[i].to ;
110             if (e[i].w && !dep[to]) {
111                 dep[to] = dep[now] + 1 ;
112                 q.push(to) ;
113             }
114         }
115     }
116     if (!dep[t]) return 0 ;
117     else return 1 ;
118 }
119
120 int dfs(int rt, int dis) {
121     if (rt == t) return dis ;
122     for (int i = head[rt]; i; i = e[i].nxt) {
123         int to = e[i].to ;
124         if (dep[to] == dep[rt] + 1 && e[i].w) {
125             int p = dfs(to, min(e[i].w, dis));
126             if (!p) {
127                 dep[to] = -1;
128                 continue;
129             }
130             e[i].w -= p ;
131             e[i ^ 1].w += p ;
132             return p ;
133         }
134     }
135     return 0 ;
136 }
137
138 int dinic() {
139     int res = 0 ;
140     while (bfs()) {
141         while (int d = dfs(s, iinf)) res += d ;
142     }
143     return res ;
144 }
145
146 int id(int x, int y) {
147     return (x - 1) * m + y ;
148 }
149
150 signed main(){
151     scanf("%d%d", &n, &m) ;
152     s = 1, t = id(n, m) ;
153     for (int i = 1; i <= n; i++)
154     for (int j = 1; j < m; j++) {
155         scanf("%d", &x) ;
156         insert(id(i, j), id(i, j + 1), x) ;
157     }
158     for (int i = 1; i < n; i++)
159     for (int j = 1; j <= m; j++) {
160         scanf("%d", &x) ;
161         insert(id(i, j), id(i + 1, j), x) ;
162     }
163     for (int i = 1; i < n; i++)
164     for (int j = 1; j < m; j++) {
165         scanf("%d", &x) ;
166         insert(id(i, j), id(i + 1, j + 1), x) ;
167     }
168     printf("%d\n", dinic()) ;
169 }
170
171 /*
172 写代码时请注意:
173     1.是否要开Long Long?数组边界处理好了么?
174     2.实数精度有没有处理?
175     3.特殊情况处理好了么?
176     4.做一些总比不做好。
177 思考提醒:
178     1.最大值和最小值问题可不可以用二分答案?
179     2.有没有贪心策略?否则能不能dp?
180 */

[BJOI2006]狼抓兔子 AC CODE

原文地址:https://www.cnblogs.com/harryhqg/p/10034489.html

时间: 2024-10-09 14:24:29

[BJOI2006]狼抓兔子 暴力AC啦!的相关文章

BJOI2006狼抓兔子

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

BZOJ1001 BJOI2006 狼抓兔子

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

[BJOI2006]狼抓兔子(网络流)

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

[BJOI2006]狼抓兔子

思路: 求网格图的最小割.然而网格图的边数比较多,直接用EdmondsKarp算法会TLE(据说用Dinic或ISAP可以过),解决的方法是将网格图的最小割转化成其对偶图的最短路,设图的左下端为起点,右上端为重点,然后跑一遍Dijkstra即可.注意要特判$n=1$或$m=1$的情况,另外因为每个方格实际上是会被斜线分成两个三角,所以点数要开两倍$n^2$,也就是$2\times10^6$. 1 #include<cstdio> 2 #include<cctype> 3 #incl

P4001 [BJOI2006]狼抓兔子

网络流快乐地跑... 这道题就是要求这个无向图的最小割. 根据最小割最大流定理,我们求个最大流就好了. 但是数据巨大.一百万个点,我们看上去就有2996001条边. 这个时候,如果按照网络流做法,建反向边的话,需要11984004条边,MLE. 其实我就没做过无向图的网络流... 结论:无向图网络流,只要两条边捆绑在一起就可以了,互相为反向边. 为什么有向图的时候反向边边权为0,而这里不为0? 无向图有两条边,你必须加上去.有向图压根就没有这条边,只是给你一个反悔的机会而已,是个中介的边. 所以

P2030 - 【BJOI2006】狼抓兔子

P2030 - [BJOI2006]狼抓兔子 Description 八中OJ上本题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>

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

【BZOJ】1001: [BeiJing2006]狼抓兔子

1001: [BeiJing2006]狼抓兔子 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) 道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的. 左上角和右下角为兔子的两个窝,开始时所有的兔子都聚集在左上角(1,1)的窝里,现在它们要跑到右下角(N,M)的窝中去,狼王开始伏击

BZOJ 1001: [BeiJing2006]狼抓兔子【最大流/SPFA+最小割,多解】

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