bzoj1001 [BeiJing2006]狼抓兔子

1001: [BeiJing2006]狼抓兔子

Time Limit: 15 Sec  Memory Limit: 162 MB
Submit: 23723  Solved: 5981
[Submit][Status][Discuss]

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

这些兔子.当然为了保险起见,如果一条道路上最多通过的兔子数为K,狼王需要安排同样数量的K只狼,

才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的

狼的数量要最小。因为狼还要去找喜羊羊麻烦.

Input

第一行为N,M.表示网格的大小,N,M均小于等于1000.

接下来分三部分

第一部分共N行,每行M-1个数,表示横向道路的权值.

第二部分共N-1行,每行M个数,表示纵向道路的权值.

第三部分共N-1行,每行M-1个数,表示斜向道路的权值.

输入文件保证不超过10M

Output

输出一个整数,表示参与伏击的狼的最小数量.

最小割裸题啊(笑);

然而N*M=1e6,T了;

我们注意到该图形态固定;

而割掉一条边等价于从该边一侧走到另一侧,经过一条权值为该边边权的路;

所以直接转成最短路即可;

(n==1 和 m==1可能要特判_(:зゝ∠)_

(貌似叫平面图转对偶图?

AC GET☆DAZE

↓代码

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<string>
  5 #include<algorithm>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 #define N 2000039
 10 #define M 6000039
 11 #define ll long long
 12 #define inf 0x3f3f3f3f
 13 using namespace std;
 14 struct edge
 15 {
 16     int to,w,next;
 17 }net[M];
 18 int head[N],S,T,tot=0,dis[N];
 19 bool inq[N];
 20 queue<int> que;
 21 void add(int u,int v,int w)
 22 {
 23     net[++tot].to=v,net[tot].w=w,net[tot].next=head[u],head[u]=tot;
 24     net[++tot].to=u,net[tot].w=w,net[tot].next=head[v],head[v]=tot;
 25 }
 26 void spfa()
 27 {
 28     memset(dis,inf,sizeof(dis));
 29     memset(inq,0,sizeof(inq));
 30     que.push(S),dis[S]=0,inq[S]=1;
 31     int a,b;
 32     while(!que.empty())
 33     {
 34         a=que.front();
 35         que.pop();
 36         for(b=head[a];b!=-1;b=net[b].next)
 37         {
 38             if(dis[a]+net[b].w<dis[net[b].to])
 39             {
 40                 dis[net[b].to]=dis[a]+net[b].w;
 41                 if(!inq[net[b].to])
 42                 {
 43                     inq[net[b].to]=1;
 44                     que.push(net[b].to);
 45                 }
 46             }
 47         }
 48         inq[a]=0;
 49     }
 50 }
 51 int main()
 52 {
 53     memset(head,-1,sizeof(head));
 54     int n,m,ans=inf,a,b,c;
 55     scanf("%d%d",&n,&m);
 56     S=0,T=2*(n-1)*(m-1)+1;
 57     if(n==1)
 58     {
 59         for(a=1;a<m;a++)
 60         {
 61             scanf("%d",&b);
 62             ans=min(ans,b);
 63         }
 64         printf("%d",ans);
 65         return 0;
 66     }
 67     if(m==1)
 68     {
 69         for(a=1;a<n;a++)
 70         {
 71             scanf("%d",&b);
 72             ans=min(ans,b);
 73         }
 74         printf("%d",ans);
 75         return 0;
 76     }
 77     for(a=1;a<m;a++)
 78     {
 79         scanf("%d",&b);
 80         add(S,a,b);
 81     }
 82     for(a=2;a<n;a++)
 83     {
 84         for(b=1;b<m;b++)
 85         {
 86             scanf("%d",&c);
 87             add(((a-1)*2-1)*(m-1)+b,(a-1)*2*(m-1)+b,c);
 88         }
 89     }
 90     for(a=1;a<m;a++)
 91     {
 92         scanf("%d",&b);
 93         add(((n-1)*2-1)*(m-1)+a,T,b);
 94     }
 95     for(a=1;a<n;a++)
 96     {
 97         scanf("%d",&b);
 98         add((a*2-1)*(m-1)+1,T,b);
 99         for(b=2;b<m;b++)
100         {
101             scanf("%d",&c);
102             add((a-1)*2*(m-1)+(b-1),(a*2-1)*(m-1)+b,c);
103         }
104         scanf("%d",&b);
105         add(S,(a*2-1)*(m-1),b);
106     }
107     for(a=1;a<n;a++)
108     {
109         for(b=1;b<m;b++)
110         {
111             scanf("%d",&c);
112             add((a-1)*2*(m-1)+b,(a*2-1)*(m-1)+b,c);
113         }
114     }
115     spfa();
116     printf("%d",dis[T]);
117     return 0;
118 }

bzoj1001

时间: 2024-12-23 11:38:18

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

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

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

[bzoj1001][BeiJing2006]狼抓兔子-题解[平面图最小割转最短路]/[Dinic求最小割]

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[BeiJing2006]狼抓兔子(无向图最小割)

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 这题的题意其实就是求一个最小割,但是由于是无向图,所以加边的时候,两边的流量都要是输入的权值,然后就是一个dinic求一下最小割. 但是这题貌似有很高超的技巧来搞,可以把平面图上的最小割转成对偶图上的最短路来做,这样可以起到很明显的优化效果.现在还不是很明白,如果以后明白了,会再来更新. dinic: #include <cstdio> #include <cstring&g

【平面图】【最小割】【最短路】【Heap-Dijkstra】bzoj1001 [BeiJing2006]狼抓兔子

http://wenku.baidu.com/view/8f1fde586edb6f1aff001f7d.html #include<cstdio> #include<queue> #include<cstring> using namespace std; typedef long long ll; #define N 1001 int n,m,S,T,nn; struct Point{int u,d;}; bool operator < (Point a,Po

BZOJ1001: [BeiJing2006]狼抓兔子 (最小割转最短路)

浅析最大最小定理在信息学竞赛中的应用---周东 ↑方法介绍 对于一个联通的平面图G(满足欧拉公式) 在s和t间新连一条边e; 然后建立一个原图的对偶图G*,G*中每一个点对应原图中每一个面,每一条边对应分割面的每一条边; 那么对偶图G*中,以原图s和t间边e新划分出的面作为起点(s*),最外的面作为终点(t*); 那么从s*到t*的每一条路都是原图G的一个割; 下图来自上方标出百度文库网址的ppt; 然后用堆(优先队列)优化的迪杰斯特拉,复杂度 O((m+n)logn) n为点数,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]狼抓兔子

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