BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路
问题描述
题解
平面图最小割=对偶图最短路
假设起点和终点间有和其他边都不相交的一条虚边。
如图,平面图的若干条边将一个平面划分为若干个图形,每个图形就是对偶图中的一个点。
对偶图中的每一个点,和它在平面图中每一个相邻的图形间有边,边权为原来分开它们的边的边权。
于是平面图最小割就是对偶图最短路。
\(\mathrm{Code}\)
#include<bits/stdc++.h>
using namespace std;
const int maxn=2*1000*1000+7;
int n,m,S,T;
int Head[maxn],to[maxn*3],Next[maxn*3],tot=1,w[maxn*3];
void addedge(int x,int y,int z){
to[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=z;
}
void add(int x,int y,int z){
addedge(x,y,z);addedge(y,x,z);
}
void Init(void){
scanf("%d%d",&n,&m);
}
int id(int x,int y,int type){
return (x-1)*(m-1)+y+(type-1)*(n-1)*(m-1);
}
void Hori(void){
for(int i=1,x;i<m;i++){
scanf("%d",&x);
add(S,id(1,i,1),x);
}
for(int i=2,x;i<n;i++){
for(int j=1;j<m;j++){
scanf("%d",&x);
add(id(i-1,j,2),id(i,j,1),x);
}
}
for(int i=1,x;i<m;i++){
scanf("%d",&x);
add(id(n-1,i,2),T,x);
}
}
void Longi(void){
for(int i=1,x;i<n;i++){
scanf("%d",&x);add(T,id(i,1,2),x);
for(int j=2;j<m;j++){
scanf("%d",&x);
add(id(i,j-1,1),id(i,j,2),x);
}
scanf("%d",&x);add(id(i,m-1,1),S,x);
}
}
void Obli(void){
for(int i=1;i<n;i++){
for(int j=1,x;j<m;j++){
scanf("%d",&x);
add(id(i,j,1),id(i,j,2),x);
}
}
}
void Graph_build(void){
S=(n-1)*(m-1)*2+1,T=S+1;
Hori();
Longi();
Obli();
}
int dis[maxn];
bool vis[maxn];
#define pii(x,y) make_pair(x,y)
void dijkstra(void){
memset(dis,0x3f,sizeof(dis));
priority_queue<pair<int,int> >q;
q.push(pii(0,S));dis[S]=0;
while(!q.empty()){
int x=(q.top()).second;q.pop();
if(vis[x]) continue;vis[x]=1;
if(x==T) return;
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(dis[y]>dis[x]+w[i]){
dis[y]=dis[x]+w[i];
q.push(pii(-dis[y],y));
}
//if(y==T) return;
}
}
}
void One(void){
int ans=0x3f3f3f3f,x;
for(int i=1;i<=n;i++) for(int j=1;j<m;j++){
scanf("%d",&x);ans=min(ans,x);
}
for(int i=1;i<n;i++) for(int j=1;j<=m;j++){
scanf("%d",&x);ans=min(ans,x);
}
printf("%d\n",ans);
}
void Work(void){
if(n==1||m==1){
One();return;
}
Graph_build();
dijkstra();
printf("%d\n",dis[T]);
}
int main(){
Init();
Work();
return 0;
}
BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路的更多相关文章
- BZOJ_2001_[BeiJing2006]狼抓兔子_最小割转对偶图
BZOJ_2001_[BeiJing2006]狼抓兔子 题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 分析:思路同NOI2010海拔. ...
- bzoj 1001: [BeiJing2006]狼抓兔子 平面图最小割
平面图跑最大流 可以转换为其对偶图跑最短路 一个环对应一个割 找到最小环(即最短路)极为所求,注意辅助边的建立 加入读入优化 不过时间还是一般 估计是dij写的不好 大神勿喷~~~ /*** ...
- bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...
- 2021.12.02 P4001 [ICPC-Beijing 2006]狼抓兔子(最小割)
2021.12.02 P4001 [ICPC-Beijing 2006]狼抓兔子(最小割) https://www.luogu.com.cn/problem/P4001 题意: 把图分成两部分需要的最 ...
- [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 31805 Solved: 8494[Submit][ ...
- BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...
- BZOJ1001:狼抓兔子(最小割最大流+vector模板)
1001: [BeiJing2006]狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨, ...
- BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)
显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...
- 【Bzoj】1001狼抓兔子(平面图最小割转对偶图最短路)
YEAH 题目链接 终于做对这道题啦 建图的艰辛难以言表- - 顺便说一句我队列转STL啦 狼抓兔子的地图符合平面图定义,于是将该图转成对偶图并求出对偶图的最短路即可. 这篇博客给了我极大的帮助 ...
随机推荐
- DispatchProxy实现动态代理及AOP
DispatchProxy类是DotnetCore下的动态代理的类,源码地址:Github,官方文档:MSDN.主要是Activator以及AssemblyBuilder来实现的(请看源码分析),园子 ...
- pyhton的安装,环境变量的设置,pycharm的安装下载,中文汉化和字体的设置
1.下载pycharm https://www.7down.com/soft/336988.html 1.pycharm的汉化下载汉化包:resources_cn.jar 放到pycharm的安 ...
- ELK日志分析系统(1)-基本环境搭建
1. 概述 ELK = Elasticsearch + Logstash + Kibana Elasticsearch是实时全文搜索和分析引擎,提供搜集.分析.存储数据三大功能:是一套开放REST和J ...
- ServerSocket类的常用方法
1.accept:侦听并接受此套接字的连接:此方法在连接传入之前一直阻塞. 2.setSoTimeout(timeout)方法的作用时设置超时时间,通过指定超时timeout值启用/禁用超时功能,以m ...
- http模块
1.引入http模块 const http = require('http') 2.创建node服务器 在创建node服务器的时候需要使用http模块中的http.creatServer()方法来进行 ...
- 复杂的POI导出Excel表格(多行表头、合并单元格)
poi导出excel有两种方式: 第一种:从无到有的创建整个excel,通过HSSFWorkbook,HSSFSheet HSSFCell, 等对象一步一步的创建出工作簿,sheet,和单元格,并添加 ...
- python实现fibonacci数列的三种方法
第一种:递归法 def fibo(n): if n < 3: return 1 return fibo(n-1) + fibo(n-2) print(fibo(6)) 第二种:循环 def fi ...
- cordova+vue混合式开发App
应要求第一次使用cordova打包了一下vue写的app项目,期间遇到了不少问题,整理一下流程并记录一下常见问题吧. cordova打包项目需要的环境配置啥的就不具体讲啦,百度一下很多教 ...
- acwing 851. spfa求最短路 模板
地址 https://www.acwing.com/problem/content/description/853/ 给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出 ...
- ESP8266源码分析--打印的基本用法
缘由: 物联网小芯片中,很多都不是特别复杂,绝大多数问题都需要靠串口打印就能定位的.所以,串口打印是一个非常靠谱的玩意.一定要好好的利用.ESP8266的打印模板设计的特别好,这里我就列出来,供大家参 ...