BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA
1001: [BeiJing2006]狼抓兔子 
Time Limit: 15 Sec  Memory Limit: 162 MB 
Submit: 14686  Solved: 3513 
[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 
输出一个整数,表示参与伏击的狼的最小数量.
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
HINT 
 2015.4.16新加数据一组,可能会卡掉从前可以过的程序。
—————————————————华华丽丽的分割线————————————————-
这道题一看就是最小割问题,而由最小割-最大流定理我们可以知道,平面图最小割=平面图最大流=对偶图的最短路 
然而我网络流并不是很会,正好这道题最大流会爆,故只能转对偶图跑最短路 
先说一下转对偶图的转法: 
这里用题目做解释: 
 
将每个三角形看做一个节点,并分别编号1,2….,并设置两个节点,起点S和终点T,将每一条边割开,即连接各个点(三角形),新的边权等于被割掉的边的边权,然后跑SPFA即可 
分析得: 
对于横行: 
1.第一行割开后的点(三角形)都与终点T连边 
2.除去第一行和最后一行的其余割开后的两个相邻的点(三角形)连边 
3.最后一行的隔开后的点(三角形)都与起点S连边 
对于纵行: 
1.最左边的纵行割开后与起点S连边 
2.除最左最右边的纵行割开后的两个相邻点(三角形)连边 
3.最右边的纵行割开后与终点T连边 
对于斜行: 
1.割开后与相邻两点(三角形)连边 
(如上述图所示) 
最后跑S到T的最短路即可
—————————————————华华丽丽的分割线————————————————-
代码如下(关于图的转换,各个公式推一下就好,其实不是很麻烦):
/**************************************************************
    Problem: 1001
    User: DaD3zZ
    Language: C++
    Result: Accepted
    Time:3428 ms
    Memory:124324 kb
****************************************************************/
#include<queue>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
bool visit[6000100]={false};
int cnt=0,next[6000100]={0},point[6000100]={0},v[6000100]={0},cost[6000100]={0};
int n,m,s,t;
int dis[6000100];
queue <int>que;
void add(int a,int b,int c)
{
    next[++cnt]=point[a];
    point[a]=cnt;
    v[cnt]=b;
    cost[cnt]=c;
}
int spfa()
{
      memset(dis,127,sizeof(dis));
      int now,loc;
      dis[s]=0;
      que.push(s);
      visit[s]=true;
      while (!que.empty())
      {
          now=que.front();que.pop();
          visit[now]=false;loc=point[now];
          while (loc>0)
          {
             if (dis[v[loc]]>dis[now]+cost[loc])
              {
                  dis[v[loc]]=dis[now]+cost[loc];
                  if (visit[v[loc]]==false)
                  {
                      visit[v[loc]]=true; que.push(v[loc]);
                  }
             }
             loc=next[loc];
         }
     }
    return dis[t];
}//裸SPFA
int main()
{
    scanf("%d%d",&n,&m);
    s=0; t=(n-1)*(m-1)*2+1;
    for (int i=1; i<=m-1; i++)
        {
            int x;scanf("%d",&x);
            add(i*2,t,x);add(t,i*2,x);
        }
    for (int i=2; i<=n-1; i++)
        for (int j=1; j<=m-1; j++)
            {
                int x;scanf("%d",&x);
                add((i-1)*(m-1)*2+j*2,(i-1)*(m-1)*2+j*2-m*2+1,x);
                add((i-1)*(m-1)*2+j*2-m*2+1,(i-1)*(m-1)*2+j*2,x);
            }
    for (int i=1; i<=m-1; i++)
        {
            int x;scanf("%d",&x);
            add((n-2)*2*(m-1)+i*2-1,s,x);
            add(s,(n-2)*2*(m-1)+i*2-1,x);
        }
    //横行的转换
    for (int i=1; i<=n-1; i++)
            {
                int x; scanf("%d",&x);
                add((i-1)*(m-1)*2+1,s,x);
                add(s,(i-1)*(m-1)*2+1,x);
                for (int j=1; j<=m-2; j++)
                    {
                        scanf("%d",&x);
                        add((i-1)*(m-1)*2+j*2+1,(i-1)*(m-1)*2+j*2,x);
                        add((i-1)*(m-1)*2+j*2,(i-1)*(m-1)*2+j*2+1,x);
                    }
                scanf("%d",&x);
                add((i-1)*(m-1)*2+(m-2)*2+2,t,x);
                add(t,(i-1)*(m-1)*2+(m-2)*2+2,x);
            }
    //竖行的转换
    for (int i=1; i<=n-1; i++)
        for (int j=1; j<=m-1; j++)
            {
                int x;scanf("%d",&x);
                add((i-1)*(m-1)*2+j*2-1,(i-1)*(m-1)*2+j*2,x);
                add((i-1)*(m-1)*2+j*2,(i-1)*(m-1)*2+j*2-1,x);
            }
    //斜行的转换
    int ans=spfa();
    printf("%d",ans);
    return 0;
}BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA的更多相关文章
- BZOJ 1001 狼抓兔子 (最小割转化成最短路)
		1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 27715 Solved: 7134[Submit][ ... 
- BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]
		1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 19528 Solved: 4818[Submit][ ... 
- bzoj1001: [BeiJing2006]狼抓兔子 -- 最小割
		1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼 ... 
- [bzoj1001]狼抓兔子 最小割
		题意概述:给出一张无向图,每条边有一个权值,割掉这条边代价为它的权值,求使起点不能到达终点的最小代价. 显然能看出这是个最小割嘛,然后最小割=最大流,建图的时候特殊处理一下再跑个最大流就好了. #in ... 
- BZOJ 1001: [BeiJing2006]狼抓兔子 最小割
		题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓 ... 
- [bzoj 1001][Beijing2006]狼抓兔子 (最小割+对偶图+最短路)
		Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ... 
- BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)
		题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 算法讨论: 1.可以用最大流做,最大流等于最小割. 2.可以把这个图转化其对偶图,然 ... 
- BZOJ 1001 狼抓兔子 平面图的最小割
		题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1001 题目大意: 见链接 思路: 求最小割,平面图的最小割等价于对偶图的最短路 直接建 ... 
- bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)
		题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ... 
- BZOJ 1001 - 狼抓兔子 - [Dinic最大流][对偶图最短路]
		题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 Description现在小朋友们最喜欢的"喜羊羊与灰太狼", ... 
随机推荐
- Ajax读取文件时出现的缓存问题
			对于Ajax缓存问题时,由于浏览器的版本问题,有时候当服务器端已更改文件中的内容,而客户端并得不到更新后的文件,而是延续之前的文件内容,解决办法是:在读取的文件内容后加一串的地址:JSON的格式为[{ ... 
- 第10章 同步设备I/O和异步设备I/O(4)_利用I/O完成端口实现Socket通信
			I/O完成端口原理见上一篇(可点击这里) 10.5.4.4 利用I/O完成端口实现Socket通信 (1)Accept和AcceptEx流程的比较 ①采用accept方式的流程示意图如下(普通的阻塞函 ... 
- 3d照片环效果(修改版--添加了x轴y轴双向转动和修复模糊度的bug)
			今天用用前两天总结的css3新效果写了一个3d照片环的效果,其中还有些bug大家可以看一看,一起改进. <!DOCTYPE html> <html lang="en&quo ... 
- vbs test
			'-----------------------------------Class clsGetProfilePrivate rootDocPublic Sub setProfile(strFileN ... 
- Java运算符优先级
			序列号 符号 名称 结合性(与操作数) 目数 说明 1 . 点 从左到右 双目 ( ) 圆括号 从左到右 [ ] 方括号 从左到右 2 + 正号 从右到左 单目 - 负号 从右到左 单目 ++ ... 
- 软件工程(QLGY2015)第二次作业点评(随机挑选20组点评)
			相关博文目录: 第一次作业点评 第二次作业点评 第三次作业点评 说明:随机挑选20组点评,大家可以看看blog名字,github项目名字,看看那种是更好的,可以学习,每个小组都会反应出一些问题,希望能 ... 
- android官方开源的高性能异步加载网络图片的Gridview例子
			这个是我在安卓安卓巴士上看到的资料,放到这儿共享下.这个例子android官方提供的,其中讲解了如何异步加载网络图片,以及在gridview中高效率的显示图片此代码很好的解决了加载大量图片时,报OOM ... 
- Jenkins进阶系列之——14配置Jenkins用户和权限
			今天给大家说说使用Jenkins专有用户数据库的配置,和一些常用的权限配置. 配置用户注册 在已运行的Jenkins主页中,点击左侧的系统管理—>Configure Global Securit ... 
- 发布HTML5 RTS游戏-古代战争
			古代战争 游戏介绍 "古代战争"是一个2.5D即时战略游戏,使用了帝国时代2的素材,并参考了它的游戏设计和玩法. 游戏基于YEngine2D引擎开发,具备生产.建造.资源采集.战斗 ... 
- webSocket实现web及时聊天的例子
			概述 websocket目前虽然无法普及应用,未来是什么样子,我们不得而知,但现在开始学习应用它,只有好处没有坏处,本随笔的WebSocket是版本13(RFC6455)协议的实现,也是目前webso ... 
