★★★   输入文件:bjrabbit.in   输出文件:bjrabbit.out   简单对比
时间限制:1 s   内存限制:162 MB

Description   Source: Beijing2006 [BJOI2006]

八中OJ上本题链接: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)<==>(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

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

Sample Input

3 4
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6

Sample Output

14
 
 
如果你想到了一个定理:
最大流==最小割,
然后聪明的想到了Dinic跑最大流
那么恭喜你,
被坑了,。。,
因为这道题的数据范围比较大
Dinic肯定跑步过去,
所以考虑用对偶图跑最短路,
至于为什么,,,我也不太懂,,
特别是代码。。
 
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<queue>
  8. #define inf 0x7fffffff
  9. using namespace std;
  10. const int maxn=+;
  11. const int M = maxn*+;
  12.  
  13. int n,m,nn,mm;
  14. int from,to;
  15. struct Edge
  16. {
  17. int v,flow;
  18. int next;
  19. }edge[M];
  20. int head[maxn],edgenum;
  21.  
  22. void add(int u,int v,int flow)
  23. {
  24. edge[edgenum].v=v ;edge[edgenum].flow=flow ;
  25. edge[edgenum].next=head[u] ;head[u]=edgenum++ ;
  26.  
  27. edge[edgenum].v=u ;edge[edgenum].flow=flow ;
  28. edge[edgenum].next=head[v] ;head[v]=edgenum++ ;
  29. }
  30.  
  31. struct node
  32. {
  33. int v,w;
  34. friend bool operator < (node a,node b)
  35. {
  36. return a.w > b.w;
  37. }
  38. }cur,tail;
  39. int d[maxn],vis[maxn];
  40. void Dijkstra(int from,int to)
  41. {
  42. for (int i= ;i<maxn ;i++) d[i]=inf;
  43. memset(vis,,sizeof(vis));
  44. d[from]=;
  45. priority_queue<node> Q;
  46. cur.v=from ;cur.w= ;
  47. Q.push(cur);
  48. while (!Q.empty())
  49. {
  50. cur=Q.top() ;Q.pop() ;
  51. int x=cur.v;
  52. if (vis[x]) continue;
  53. vis[x]=;
  54. for (int i=head[x] ;i!=- ;i=edge[i].next)
  55. {
  56. if (d[edge[i].v ]>d[x]+edge[i].flow)
  57. {
  58. d[edge[i].v ]=d[x]+edge[i].flow;
  59. tail.v=edge[i].v;
  60. tail.w=d[edge[i].v ];
  61. Q.push(tail);
  62. }
  63. }
  64. }
  65. printf("%d\n",d[to]);
  66. }
  67.  
  68. int main()
  69. {
  70. while (scanf("%d%d",&n,&m)!=EOF)
  71. {
  72. memset(head,-,sizeof(head));
  73. edgenum=;
  74. from=;
  75. to=*(n-)*(m-)+;
  76. int x,y,cost;
  77. for (int i= ;i<=n ;i++)
  78. {
  79. for (int j= ;j<m ;j++)
  80. {
  81. scanf("%d",&cost);
  82. x= i== ? from : (*(i-)-)*(m-)+j;
  83. y= i==n ? to : (*(i-))*(m-)+j;
  84. add(x,y,cost);
  85. }
  86. }
  87. for (int i= ;i<n ;i++)
  88. {
  89. for (int j= ;j<=m ;j++)
  90. {
  91. scanf("%d",&cost);
  92. x= j== ? to : (*(i-))*(m-)+j-;
  93. y= j==m ? from : (*(i-))*(m-)+j-+m;
  94. add(x,y,cost);
  95. }
  96. }
  97. for (int i= ;i<n ;i++)
  98. {
  99. for (int j= ;j<m ;j++)
  100. {
  101. scanf("%d",&cost);
  102. x=(*(i-))*(m-)+j;
  103. y=(*(i-)+)*(m-)+j;
  104. add(x,y,cost);
  105. }
  106. }
  107. Dijkstra(from,to);
  108. }
  109. return ;
  110. }

下面是自己写的蜜汁WA、、

 
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<queue>
  6. #include<algorithm>
  7. using namespace std;
  8. const int MAXN=;
  9. const int MAXM=;
  10. const int maxn=0x7fffffff;
  11. inline void read(int &n)
  12. {
  13. char c='+';int x=;bool flag=;
  14. while(c<''||c>''){c=getchar();if(c=='-')flag=;}
  15. while(c>=''&&c<=''){x=x*+(c-);c=getchar();}
  16. flag==?n=-x:n=x;
  17. }
  18. struct node
  19. {
  20. int u,v,f,nxt;
  21. }edge[MAXM];
  22. int head[MAXN];
  23. int num=;
  24. int n,m;
  25. int dis[MAXN];
  26. bool vis[MAXN];
  27. inline void add_edge(int x,int y,int z)
  28. {
  29. edge[num].u=x;
  30. edge[num].v=y;
  31. edge[num].f=z;
  32. edge[num].nxt=head[x];
  33. head[x]=num++;
  34. }
  35. inline void SPFA(int s,int t)
  36. {
  37. for(int i=;i<t;i++)
  38. dis[i]=maxn;
  39. dis[s]=;
  40. vis[s]=;
  41. queue<int>q;
  42. q.push(s);
  43. while(q.size()!=)
  44. {
  45. int p=q.front();
  46. q.pop();
  47. vis[p]=;
  48. for(int i=head[p];i!=-;i=edge[i].nxt)
  49. {
  50. if(dis[edge[i].v]>dis[edge[i].u]+edge[i].f)
  51. {
  52. dis[edge[i].v]=dis[edge[i].u]+edge[i].f;
  53. if(vis[edge[i].v]==)
  54. {
  55. vis[edge[i].v]=;
  56. q.push(edge[i].v);
  57. }
  58. }
  59. }
  60. }
  61. printf("%d",dis[t]);
  62. }
  63. int main()
  64. {
  65. //freopen("bjrabbit.in","r",stdin);
  66. //freopen("bjrabbit.out","w",stdout);
  67. read(n);read(m);
  68. memset(head,-,sizeof(head));
  69. int from=;
  70. int to=(*(n-)*(m-))+;
  71. int spend,x,y;
  72. for(int i=;i<=n;i++)
  73. for(int j=;j<m;j++)
  74. {
  75. read(spend);
  76. x= i==? from: (*(i-)-)*(m-)+j;
  77. y= i==n? to : (*(i-))*(m-)+j;
  78. // printf("%d %d %d \n",x,y,spend);
  79. add_edge(x,y,spend);
  80. add_edge(y,x,spend);
  81. }
  82. for(int i=;i<n;i++)
  83. for(int j=;j<=m;j++)
  84. {
  85. read(spend);
  86. x= j==?to:(*(i-))*(m-)+j-;
  87. y= j==m?from:(*(i-))*(m-)+j-+m;
  88. //printf("%d %d %d \n",x,y,spend);
  89. add_edge(x,y,spend);
  90. add_edge(y,x,spend);
  91. }
  92. for(int i=;i<n;i++)
  93. for(int j=;j<m;j++)
  94. {
  95. read(spend);
  96. x=(*(i-))*(m-)+j;
  97. y=(*(i-)+)*(m-)+j;
  98. //printf("%d %d %d \n",x,y,spend);
  99. add_edge(x,y,spend);
  100. add_edge(y,x,spend);
  101. }
  102. SPFA(from,to);
  103. return ;
  104. }

752. [BJOI2006] 狼抓兔子的更多相关文章

  1. P4001 [BJOI2006]狼抓兔子(对偶图)

    P4001 [BJOI2006]狼抓兔子 最短路+对偶图 看这题最容易想到的就是网络流.Dinic可以过,据说还跑得比正解快. 如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu ...

  2. BJOI2006狼抓兔子

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 9967  Solved: 2267[Submit][S ...

  3. [BJOI2006]狼抓兔子

    题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...

  4. 1001. [BJOI2006]狼抓兔子【最小割】

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

  5. BZOJ1001 BJOI2006 狼抓兔子

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

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

    题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...

  7. BZOJ1001 洛谷4001 [BJOI2006]狼抓兔子 题解

    题目 这个题目有多种解法,这个题也是一个比较经典的题了,正是因为他的多样的做法,这个题主要难在建图和优化,因为这是一个网格图,所以spfa肯定过不去,所以用最短路解法的话,只能用dij,而网络流也是要 ...

  8. BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)

    显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...

  9. P4001 [BJOI2006]狼抓兔子

    传送门 思路: 不少题解都是用网络流来做最小割(网络流是什么),但对于一个不会网络流的蒟蒻来做这题相当困难. 听机房daolao说可以重构图做最短路.然后就baidu将平面图转换成一个对偶图,因为网络 ...

随机推荐

  1. 如何让NSURLConnection在子线程中运行

    可以有两个办法让NSURLConnection在子线程中运行,即将NSURLConnection加入到run loop或者NSOperationQueue中去运行. 前面提到可以将NSTimer手动加 ...

  2. 【译文】采用chrome的DevTool中TimeLine和profile工具提升Web app性能

    ->译文,原文在这里<- 本文地址: http://www.cnblogs.com/blackmanba/p/web-perfomance-with-Chrome-DevTools.htm ...

  3. Codeforces 994A. Fingerprints

    题意 从x数组中找到最多的y数组中有的数字,按在x数组中出现的顺序输出. 注意 这题x数组和y数组都不会出现重复数字. 代码 #include <bits/stdc++.h> using ...

  4. Java标识符规范

    1.标识符用来定义包名,类名,方法名,变量名,常量名. 2.标识符必须由字母.下划线.$符号组成,不能以数字开头.不能是Java中的保留关键字.

  5. ZBrush中Blob点滴笔刷介绍

    对于ZBrush®来说,笔刷的使用时至关重要的,ZBrush中给我们提供了越来越多的笔刷的同时,我们也要根据经验来合理选择笔刷.本文内容小编将分享Blob点滴笔刷的简单介绍,该笔刷在使用时笔头犹如一股 ...

  6. Mac 如何寻找Mac自带的IDLE

    Mac 如何寻找Mac自带的IDLE 每次要打开IDLE时,需要如下动作:打开terminal --> 输入idle --> 回车,就自动打开IDLE了 图标如下: 选择在“Finder中 ...

  7. jquery获取自定义属性的值

    //获取属性值 1 <div id="text" value="黑哒哒的盟友"><div> jQuery取值: $("#tex ...

  8. css3之BFC、IFC、GFC和FFC

    CSS2.1中只有BFC和IFC, CSS3中才有GFC和FFC. What's FC?一定不是KFC,FC的全称是:Formatting Contexts,是W3C CSS2.1规范中的一个概念.它 ...

  9. jsp基本内置标签

    <jsp:foward page="url"> <jsp:param value=" " name=" "/> &l ...

  10. C# 鼠标左右手切换

    using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServi ...