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;
10 }e[N*6];
11 int k=1,head[N],vis[N],dep[N],cur[N];
12 int n,m,T;
13 int read() {
14     char c=getchar();int x=0;
15     while (c<‘0‘||c>‘9‘) c=getchar();
16     while (c>=‘0‘&&c<=‘9‘) x=x*10+c-‘0‘,c=getchar();
17     return x;
18 }
19 void adde(int u,int v,int c) {
20     e[k].v=v;e[k].c=c;e[k].next=head[u];head[u]=k++;
21 }
22 queue <int> q;
23 bool bfs(int s,int t,int tim) {
24     dep[s]=0;vis[s]=tim;
25     q.push(s);
26     while (!q.empty()) {
27         int u=q.front();q.pop();
28         for (int i=head[u];~i;i=e[i].next) {
29             int v=e[i].v;
30             if ((tim^vis[v])&&e[i].c>e[i].f) {
31                 dep[v]=dep[u]+1;vis[v]=tim;q.push(v);
32             }
33         }
34     }
35     return tim==vis[t];
36 }
37
38 int dfs(int u,int t,int F) {
39     if (u==t||F==0) return F;
40     int tot=0,f;
41     for (int &i=cur[u];~i;i=e[i].next) {
42         int v=e[i].v;
43         if (dep[v]==dep[u]+1&&vis[v]==T&&(f=dfs(v,t,min(F,e[i].c-e[i].f)))>0) {
44             tot+=f,F-=f;
45             e[i].f+=f,e[i^1].f-=f;
46             if (F==0) break;
47         }
48     }
49     return tot;
50 }
51
52 void dinic() {
53     int ans=0;
54     while (bfs(1,n*m,++T)) {
55         for (int i=1;i<=n*m;i++) cur[i]=head[i];
56         ans+=dfs(1,n*m,inf);
57     }
58     printf("%d\n",ans);
59 }
60
61 int main()
62 {
63     memset(head,-1,sizeof(head));
64     n=read();m=read();
65     for (int i=1,x=0;i<=n;i++) {
66         x++;
67         for (int j=1;j<m;j++,x++) {
68             int w=read();
69             adde(x,x+1,w);adde(x+1,x,w);
70         }
71     }
72     for (int i=1,x=1;i<n;i++) {
73         for (int j=1;j<=m;j++,x++) {
74             int w=read();
75             adde(x,x+m,w);adde(x+m,x,w);
76         }
77     }
78     for (int i=1,x=0;i<n;i++) {
79         x++;
80         for (int j=1;j<m;j++,x++) {
81             int w=read();
82             adde(x,x+m+1,w);adde(x+m+1,x,w);
83         }
84     }
85     dinic();
86     return 0;
87 }

时间: 2025-01-11 03:00:12

bzoj1001狼抓兔子的相关文章

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

[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 狼抓兔子

这道题 我只会最大流写法 加了当前弧优化就过了 只看代码就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 狼抓兔子 终于过了!

时间来不及了,先贴代码吧!有时间再写. 好苦逼啊,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++)

[日常摸鱼]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 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的