当前位置: 首页 > news >正文

BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)

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

算法讨论:

1、可以用最大流做,最大流等于最小割。

2、可以把这个图转化其对偶图,然后在对偶图上跑最短路即可。

一个平面图的最小割等价于其对偶图从S到T的最短路。并不是所有的图都有对偶图,平面图也有一定的要求,自己可以百度一下。

代码(用BZOJ的数据测过了,但是在BZOJ上过不去。爆WA,并不知道是为什么,里面有个特判,并不知道有没有用处。)

  1 #include <iostream>
  2 #include <cstring>
  3 #include <cstdlib>
  4 #include <algorithm>
  5 #include <cstdio>
  6 
  7 using namespace std;
  8 
  9 const int N = 2000000 + 5;
 10 const int inf = 0x3f3f3f3f;
 11 
 12 int n, cnt, m;
 13 int head[N], que[N], dis[N];
 14 bool vis[N];
 15 
 16 struct Edge {
 17   int from, to, dis, next;
 18 }edges[N * 4];
 19 
 20 void add(int u, int v, int dis) {
 21   ++ cnt;
 22   edges[cnt].from = u; edges[cnt].to = v;
 23   edges[cnt].dis = dis; edges[cnt].next = head[u];
 24   head[u] = cnt;
 25   ++ cnt;
 26   edges[cnt].from = v; edges[cnt].to = u;
 27   edges[cnt].dis = dis; edges[cnt].next = head[v];
 28   head[v] = cnt;
 29 }
 30 
 31 void spfa(int s, int t) {
 32   int h = 1, tail = 1;
 33   for(int i = s; i <= t; ++ i) {
 34     dis[i] = inf;
 35     vis[i] = false;
 36   }
 37   vis[s] = true; dis[s] = 0;
 38   que[h] = s;
 39   while(h <= tail) {
 40     int x = que[h];
 41     vis[x] = false;
 42     for(int i = head[x]; i; i = edges[i].next) {
 43       int v = edges[i].to;
 44       if(dis[v] > dis[x] + edges[i].dis) {
 45         dis[v] = dis[x] + edges[i].dis;
 46         if(!vis[v]) {
 47           que[++ tail] = v;
 48           vis[v] = true;
 49         }
 50       }
 51     }
 52     ++ h;
 53   }
 54   printf("%d\n", dis[t]);
 55 }
 56 
 57 #define stone
 58 
 59 int main() {
 60 #ifndef stone
 61 
 62   freopen("bjrabbit.in", "r", stdin);
 63   freopen("bjrabbit.out", "w", stdout);
 64 
 65 #endif
 66   
 67   int tmp, s, t, x, mn = 0x3f3f3f3f;
 68   scanf("%d%d", &n, &m);
 69   s = 0; t = (n - 1) * (m - 1) * 2 + 1;
 70   tmp = (m - 1) * 2;
 71   for(int i = 1; i <= n; ++ i) {
 72     for(int j = 1; j < m; ++ j) {
 73       scanf("%d", &x);
 74       mn = min(x, mn);
 75       if(i == 1) {
 76         add(j * 2 + tmp * (i - 1), t, x);
 77       }
 78       else if(i == n) {
 79         add(s, j * 2 + tmp * (i - 2) - 1, x);
 80       }
 81       else {
 82         add(j * 2 + tmp * (i - 1), j * 2 + tmp * (i - 2) - 1, x);
 83       }
 84     }
 85   }
 86   for(int i = 1; i < n; ++ i) {
 87     for(int j = 1; j <= m; ++ j) {
 88       scanf("%d", &x);
 89       mn = min(x, mn);
 90       if(j == 1) {
 91         add(s, tmp * (i - 1) + 1, x);
 92       }
 93       else if(j == m) {
 94         add(tmp * i, t, x);
 95       }
 96       else {
 97         add(tmp * (i - 1) + 2 * (j - 1), tmp * (i - 1) + 2 * (j - 1) + 1, x);
 98       }
 99     }
100   }
101   for(int i = 1; i < n; ++ i) {
102     for(int j = 1; j < m; ++ j) {
103       scanf("%d", &x);
104       mn = min(mn, x);
105       add(tmp * (i - 1) + j * 2, tmp * (i - 1) + j * 2 - 1, x);
106     }
107   }
108   if(n == 1 || m == 1) printf("%d\n", mn);
109   else spfa(s, t);
110 
111 #ifndef stone
112 
113   fclose(stdin); fclose(stdout);
114 
115 #endif
116   
117   return 0;
118 }
1001

 

转载于:https://www.cnblogs.com/sxprovence/p/5308056.html

相关文章:

  • Material Design 控件
  • ARCproject中加入非ARC文件,或者非ARC环境中加入ARC文件
  • IOS开发UI篇--IOS动画(Core Animation)总结
  • css中的单位
  • 关于退运美国转基因玉米含有MRI 162转基因成分的质疑
  • Shiro基于组织机构的登录验证
  • maven部署构建到私服
  • Android 发送短信总结
  • 笔记 - 10.4、HTML - CSS滤镜笔记
  • Java BigDecimal详解
  • javap的使用
  • java面向对象中的方法重载与方法重写的区别
  • Hadoop2.7实战v1.0之Hive-2.0.0+MySQL本地模式安装
  • 封装常用的Javascript跨浏览器方法
  • 如何安装linux系统
  • hexo+github搭建个人博客
  • ComponentOne 2017 V2版本正式发布
  • JAVA 学习IO流
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java教程_软件开发基础
  • mysql中InnoDB引擎中页的概念
  • React16时代,该用什么姿势写 React ?
  • vue数据传递--我有特殊的实现技巧
  • 成为一名优秀的Developer的书单
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 关于Java中分层中遇到的一些问题
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端_面试
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 试着探索高并发下的系统架构面貌
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​虚拟化系列介绍(十)
  • #vue3 实现前端下载excel文件模板功能
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (¥1011)-(一千零一拾一元整)输出
  • (1) caustics\
  • (4)logging(日志模块)
  • (k8s中)docker netty OOM问题记录
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)程序员疫苗:代码注入
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .form文件_SSM框架文件上传篇
  • .NET 5种线程安全集合
  • .net 7 上传文件踩坑
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .net6使用Sejil可视化日志
  • @Bean有哪些属性
  • @Responsebody与@RequestBody