BZOJ 1001 [BeiJing2006]狼抓兔子

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001

题意: ...

很容易想到求的是一个最小割=最大流。

之前一直用的刘汝佳的模板STL过题,很久没用过数组模拟了。

再次熟悉一下写法,first数组是索引数组,标记的结点的最后一条边,利用next数组找到上一条边。

 1 #include <bits/stdc++.h>
 2
 3 using namespace std;
 4
 5 #define N 1100000
 6 int n,m,first[N],next[N*6],v[N*6],w[N*6],tot,jy,ans,vis[N],S,T,xx,pos[N];
 7
 8 void Add(int x,int y,int z)
 9 {
10     w[tot] = z;
11     v[tot] = y;
12     next[tot] = first[x];
13     first[x] = tot++;
14 }
15
16 void add(int x,int y,int z)
17 {
18     Add(x,y,z);
19     Add(y,x,z);
20 }
21
22 bool bfs()
23 {
24     memset(vis,-1,sizeof(vis)),vis[S]=0;
25     queue<int>q;
26     q.push(S);
27     while(!q.empty())
28     {
29         int t=q.front();
30         q.pop();
31         for(int i=first[t]; ~i; i=next[i])
32             if(w[i]&&vis[v[i]]==-1)
33                 vis[v[i]]=vis[t]+1,q.push(v[i]);
34     }
35     return vis[T]!=-1;
36 }
37
38 int dfs(int x,int y)
39 {
40     if(x==T)return y;
41     int r=0;
42     for(int i=first[x]; ~i&&y>r; i=next[i])
43         if(w[i]&&vis[v[i]]==vis[x]+1)
44         {
45             int t=dfs(v[i],min(y-r,w[i]));
46             w[i]-=t,w[i^1]+=t,r+=t;
47         }
48     if(!r)vis[x]=-1;
49     return r;
50 }
51
52 int main()
53 {
54     memset(first,-1,sizeof(first));
55     scanf("%d%d",&n,&m);
56     S=m+1,T=n*m+m;
57     for(int i=1; i<=n; i++)
58         for(int j=1; j<m; j++)
59             scanf("%d",&xx),add(i*m+j,i*m+j+1,xx);
60     for(int i=1; i<n; i++)
61         for(int j=1; j<=m; j++)
62             scanf("%d",&xx),add(i*m+j,(i+1)*m+j,xx);
63     for(int i=1; i<n; i++)
64         for(int j=1; j<m; j++)
65             scanf("%d",&xx),add(i*m+j,(i+1)*m+j+1,xx);
66
67     while(bfs())
68         while(jy=dfs(S,0x3fffffff))
69             ans+=jy;
70     printf("%d\n",ans);
71 }
时间: 2024-10-12 23:57:03

BZOJ 1001 [BeiJing2006]狼抓兔子的相关文章

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

BZOJ 1001: [BeiJing2006]狼抓兔子 对偶图

本题是最大流转最小割转对偶图最短路 推荐周东的<浅析最大最小定理在信息学竞赛中的应用> 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 12166  Solved: 2866 [Submit][Status][Discuss] Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在

BZOJ 1001: [BeiJing2006]狼抓兔子(最短路)

平面图的最小割转化为对偶图的最短路(资料:两极相通——浅析最大最小定理在信息学竞赛中的应用) ,然后DIJKSTRA就OK了. ------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<que

BZOJ 1001: [BeiJing2006]狼抓兔子 最小割

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

BZOJ 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) 道路上的权值表示这条路上最多能够通过的兔子数,道路是

bzoj 1001: [BeiJing2006]狼抓兔子 平面图最小割

平面图跑最大流 可以转换为其对偶图跑最短路 一个环对应一个割  找到最小环(即最短路)极为所求,注意辅助边的建立 加入读入优化  不过时间还是一般  估计是dij写的不好   大神勿喷~~~ /************************************************************** Problem: 1001 User: 96655 Language: C++ Result: Accepted Time:1724 ms Memory:95120 kb ****

bzoj 1001: [BeiJing2006]狼抓兔子 最短路+对偶图

题意:求一个表格图的最小割. 分析:这题如果套上一个网络流的话是会挂的,所以我们要把该图转换成它的对偶图,具体方法可以参照两级相通----浅析最大最小定理在信息学竞赛中的应用 By 周冬.然后跑对短路就好了. 良心的出题人居然没卡spfa 这题要特判n=1 or m=1的情况 这次一开始无限12msWA的原因是spfa的结束条件是until head>=tail,而我用的是循环队列--不想多说,以后一定要注意才行啊. 代码: const maxn=2000009; var s,t,n,m,e:l

bzoj 1001 [BeiJing2006]狼抓兔子 最小割+最短路

题面 题目传送门 解法 将最大流转化成最小割,然后跑最短路即可 具体如何见图可以参考下图 尽量用dijkstra 代码 #include <bits/stdc++.h> #define PI pair <int, int> #define mp make_pair #define N 1010 using namespace std; template <typename node> void chkmax(node &x, node y) {x = max(x

【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)的窝中去,狼王开始伏击