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也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ... 
随机推荐
- 零基础逆向工程18_PE结构02_联合体_节表_PE加载过程
			联合体 特点 1.联合体的成员是共享内存空间的 2.联合体的内存空间大小是联合体成员中对内存空间大小要求最大的空间大小 3.联合体最多只有一个成员有效 节表数据结构说明 PE 加载 过程 FileBu ... 
- 设置Cookie最大存活时间
			Cookie和Session都是由Tomcat自动创建的对象,Cookie的默认最大存活时间是 -1 ,即当浏览器关闭时Cookie就消失了:Session的默认最大存活时间是30分钟. 使用Sess ... 
- [Oracle 视图] ALL_OBJECTS
			ALL_OBJECTS ALL_OBJECTS describes all objects accessible to the current user. ALL_OBJECTS描述当前用户的可访问的 ... 
- UI事件与内容,舞台与演员
			UI事件:创建/清除/显示/隐藏/填充内容/位置变化/形态变化/尺寸变化/颜色变化/ 非UI事件:点击/输入/拖动/ 
- C基础的练习集及测试答案(1-15)
			练习题:注:标有(课堂)字样的为课上练习,其他为课下练习基础题(50题)1.(课堂)编写程序,输出“XXX欢迎来到动物园!”(XXX是自己的名字). //1.(课堂)编写程序,输出“XXX欢迎来到动物 ... 
- Codeforces 724 G Xor-matic Number of the Graph 线性基+DFS
			G. Xor-matic Number of the Graph http://codeforces.com/problemset/problem/724/G 题意:给你一张无向图.定义一个无序三元组 ... 
- 协议学习之   vamei博客系列 总结
			1. 分层: 物理层(physical layer) 所谓的物理层,是指光纤.电缆或者电磁波等真实存在的物理媒介.这些媒介可以传送物理信号,比如亮度.电压或者振幅.对于数字应用来说,我们只需要两种物理 ... 
- ceisum_加载倾斜摄影模型
			osgb转换为3Dtiles格式(使用工具转换) 然后加载到cesium中(加载代码见下,可以控制模型高度) var offset = function(height,tileset) { conso ... 
- Oracle RAC/Clusterware 多种心跳heartbeat机制介绍 RAC超时机制分析
			ORACLE RAC中最主要存在2种clusterware集群件心跳 & RAC超时机制分析: 1.Network Heartbeat 网络心跳 每秒发生一次: 10.2.0.4以后网络心跳 ... 
- [学习总结] python语言学习总结 (三)
			函数闭包 定义 延伸了作用域的函数(能访问定义体之外定义的非全局变量 作用 共享变量的时候避免使用了不安全的全局变量 允许将函数与某些数据关联起来,类似于简化版面向对象编程 相同代码每次生成的闭包,其 ... 
