luogu4001 [BJOI2006]狼抓兔子
裸dinic就跑过去了,哪用得着平面图最小割=最短路……
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
int n, m, w, ss, tt, hea[1000005], cnt, lev[1000005], cur[1000005], maxFlow;
const int oo=0x3f3f3f3f;
queue<int> d;
struct Edge{
int too, nxt, val;
}edge[8000005];
void add_edge(int fro, int too, int val){
edge[cnt].nxt = hea[fro];
edge[cnt].too = too;
edge[cnt].val = val;
hea[fro] = cnt++;
}
void addEdge(int fro, int too, int val){
add_edge(fro, too, val);
add_edge(too, fro, val);//无向边一开始就能增广
}
int f(int a, int b){
return (a-1)*m+b;
}
bool bfs(){
memset(lev, 0, sizeof(lev));
lev[ss] = 1;
d.push(ss);
while(!d.empty()){
int x=d.front();
d.pop();
for(int i=hea[x]; i!=-1; i=edge[i].nxt){
int t=edge[i].too;
if(!lev[t] && edge[i].val>0){
lev[t] = lev[x] + 1;
d.push(t);
}
}
}
return lev[tt]!=0;
}
int dfs(int x, int lim){
if(x==tt) return lim;
int addFlow=0;
for(int &i=cur[x]; i!=-1; i=edge[i].nxt){
int t=edge[i].too;
if(lev[t]==lev[x]+1 && edge[i].val>0){
int tmp=dfs(t, min(lim-addFlow, edge[i].val));
edge[i].val -= tmp;
edge[i^1].val += tmp;
addFlow += tmp;
if(addFlow==lim) break;
}
}
return addFlow;
}
void dinic(){
while(bfs()){
for(int i=ss; i<=tt; i++) cur[i] = hea[i];
maxFlow += dfs(ss, oo);
}
}
int main(){
memset(hea, -1, sizeof(hea));
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<m; j++){
scanf("%d", &w);
addEdge(f(i,j), f(i,j+1), w);
}
for(int i=1; i<n; i++)
for(int j=1; j<=m; j++){
scanf("%d", &w);
addEdge(f(i,j), f(i+1,j), w);
}
for(int i=1; i<n; i++)
for(int j=1; j<m; j++){
scanf("%d", &w);
addEdge(f(i,j), f(i+1,j+1), w);
}
ss = f(1,1); tt = f(n,m);
dinic();
cout<<maxFlow<<endl;
return 0;
}
平面图最短路:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int n, m, ss, tt, uu, hea[2000005], cnt, dis[2000005], din;
bool vis[2000005];
const int oo=0x3f3f3f3f;
int p(int a, int b){
return (a-1)*(m-1)+b;
}
int q(int a, int b){
return p(a,b)+(n-1)*(m-1);
}
struct Edge{
int too, nxt, val;
}edge[8000005];
struct Node{
int idx, val;
}nd[9000005];
bool cmp(Node x, Node y){
return x.val>y.val;
}
void add_edge(int fro, int too, int val){
edge[++cnt].nxt = hea[fro];
edge[cnt].too = too;
edge[cnt].val = val;
hea[fro] = cnt;
}
void addEdge(int fro, int too, int val){
add_edge(fro, too, val);
add_edge(too, fro, val);
}
void dijk(){
memset(dis, 0x3f, sizeof(dis));
dis[ss] = 0;
nd[++din] = (Node){ss, 0};
while(din){
Node x=nd[1];
pop_heap(nd+1, nd+1+din, cmp);
din--;
if(vis[x.idx]) continue;
vis[x.idx] = true;
for(int i=hea[x.idx]; i; i=edge[i].nxt){
int t=edge[i].too;
if(!vis[t] && dis[t]>dis[x.idx]+edge[i].val){
dis[t] = dis[x.idx] + edge[i].val;
nd[++din] = (Node){t, dis[t]};
push_heap(nd+1, nd+1+din, cmp);
}
}
}
}
int main(){
cin>>n>>m;
if(n==1 || m==1){
int tmp=oo;
for(int i=1; i<=max(n,m); i++){
scanf("%d", &uu);
tmp = min(tmp, uu);
}
cout<<tmp<<endl;
return 0;
}
ss = 0; tt = q(n-1,m-1) + 1;
for(int i=1; i<=n; i++)
for(int j=1; j<m; j++){
scanf("%d", &uu);
if(i==1) addEdge(ss, p(i,j), uu);
else if(i==n) addEdge(q(i-1,j), tt, uu);
else addEdge(q(i-1,j), p(i,j), uu);
}
for(int i=1; i<n; i++)
for(int j=1; j<=m; j++){
scanf("%d", &uu);
if(j==1) addEdge(tt, q(i,j), uu);
else if(j==m) addEdge(p(i,j-1), ss, uu);
else addEdge(p(i,j-1), q(i,j), uu);
}
for(int i=1; i<n; i++)
for(int j=1; j<m; j++){
scanf("%d", &uu);
addEdge(p(i,j), q(i,j), uu);
}
dijk();
cout<<dis[tt]<<endl;
return 0;
}
luogu4001 [BJOI2006]狼抓兔子的更多相关文章
- P4001 [BJOI2006]狼抓兔子(对偶图)
P4001 [BJOI2006]狼抓兔子 最短路+对偶图 看这题最容易想到的就是网络流.Dinic可以过,据说还跑得比正解快. 如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu ...
- BJOI2006狼抓兔子
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 9967 Solved: 2267[Submit][S ...
- 752. [BJOI2006] 狼抓兔子
★★★ 输入文件:bjrabbit.in 输出文件:bjrabbit.out 简单对比时间限制:1 s 内存限制:162 MB Description Source: Beijin ...
- [BJOI2006]狼抓兔子
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- 1001. [BJOI2006]狼抓兔子【最小割】
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- BZOJ1001 BJOI2006 狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
- [BJOI2006]狼抓兔子(网络流)
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- BZOJ1001 洛谷4001 [BJOI2006]狼抓兔子 题解
题目 这个题目有多种解法,这个题也是一个比较经典的题了,正是因为他的多样的做法,这个题主要难在建图和优化,因为这是一个网格图,所以spfa肯定过不去,所以用最短路解法的话,只能用dij,而网络流也是要 ...
- BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)
显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...
随机推荐
- webpack.config.js====插件html-webpack-plugin
1. 安装 cnpm install html-webpack-plugin --save-dev 2. webpack.config.js中使用 const htmlWebpackPlugin = ...
- hashlib(加盐)回炉练习
简介: 用于加密相关的操作,代替了md5模块和sha模块,主要提供SHA1,SHA224,SHA256,SHA384,SHA512,MD5算法.在python3中已经废弃了md5和sha模块,简单说明 ...
- Eucalyptus——EC2的开源实现(转载)
Eucalyptus[22]是加利福尼亚大学的 Daniel Nurmi 等人实现的,是一个用于实现云计算的开源软件基础设施.Eucalyptus 是 Amazon EC2 的一个开源实现,它与 EC ...
- 内容导出成word
private void 导出word(string 内容) { string tit = "<html xmlns:v=\"urn:schemas-microsoft-co ...
- POJ 2923 Relocation(01背包+状态压缩)
题意:有人要搬家,有两辆车可以运送,有若干家具,车有容量限制,而家具也有体积,那么如何运送会使得运送车次最少?规定两车必须一起走,两车一次来回只算1躺. 思路:家具怎么挑的问题,每趟车有两种可能:1带 ...
- Codeforces Round #321 (Div. 2) C Kefa and Park(深搜)
dfs一遍,维护当前连续遇到的喵的数量,然后剪枝,每个统计孩子数量判断是不是叶子结点. #include<bits/stdc++.h> using namespace std; ; int ...
- 2012-2013 ACM-ICPC, NEERC, Central Subregional Contest H Milestones1 (暴力)
预处理+暴力,每个颜色都是独立的,求个前缀和,减一减判断一个在区间内颜色是否存在. 算了算复杂度好像有点勉强,但是还是过了,学了主席树以后用主席树在做一下 #include<bits/stdc+ ...
- UVA1607 Gates 与非门电路 (二分)
题意:给你一个按发生时间的序列,表示与非门电路的输入,一开始全部输入是x,现在要改成尽量少的x,实现相同的功能. 题解:电路功能只有4中0,1,x,非x.那么如果一开始x改变了,输出结果不变,那么说明 ...
- 天坑之mysql乱码问题以及mysql重启出现1067的错误解决
相信很多小伙伴都遇到过数据库中文乱码问题,很头疼,明明Navicat上的编码格式都是utf-8是一样的啊? 为什么还是乱码? 原因是Navicat上的数据库编码格式并不是真正的编码格式 ,所以明白了吗 ...
- 从输入url到页面加载完成发生了什么详解
这是一道经典的面试题,这道题没有一个标准的答案,它涉及很多的知识点,面试官会通过这道题了解你对哪一方面的知识比较擅长,然后继续追问看看你的掌握程度.当然我写的这些也只是我的一些简单的理解,从前端的角度 ...