bzoj2007 NOI2010 海拔(对偶图)
# 80分(最小割)思路
先考虑如果没有题目中东南角为$1$那个限制的话会怎样。
那么只要让每个点的海拔都是$0$就行了。这样不论怎样走,最后的答案都是0.
然后再考虑那个东南角为$1$的限制表达了什么。其实说明了最后的答案一定是右下角一部分海拔全部为$1$,左上角一部分海拔全部为$0$。
所以这样只要找到分界点就行了。
这就是最小割的裸题啊。以$(1,1)$为起点,$(n+1,n+1)$为终点跑一遍最小割就行了。
# 100分(对偶图)思路
直接最小割过不去后面的大数据。所以要用对偶图优化一下。
平面图就是像题目中这样两条边的交点都是顶点的图。
如图

图中$9$个方格叫做平面图的面。对于一个平面图的对偶图,就是将平面图中的每个边两边的两个面连接起来。
上图的对偶图就长这样

红色部分就是对偶图了。
然后只要将原图转化成对偶图之后,跑最短路就行了。
# 80(90)分代码
```cpp=
/*
* @Author: wxyww
* @Date: 2019-02-12 11:28:33
* @Last Modified time: 2019-02-12 15:42:39
*/
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
#define num(x,y) (x - 1) * (n + 1) + y
const int N = 500000,M = 10000000,INF = 1e9;
ll read() {
ll x=0,f=1;char c=getchar();
while(c'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&cq;
int dep[N];
int S,T;
int bfs() {
memset(dep,0,sizeof(dep));
while(!q.empty()) q.pop();
dep[S] = 1;q.push(S);
while(!q.empty()) {
int u = q.front();q.pop();
for(int i = head[u];i;i = e[i].nxt) {
int v = e[i].v;
if(!dep[v] && e[i].w) {
q.push(v);
dep[v] = dep[u] + 1;
if(v == T) return 1;
}
}
}
return 0;
}
int cur[N];
int dfs(int u,int now) {
if(u == T) return now;
int ret = 0;
for(int &i = cur[u];i;i = e[i].nxt) {
int v = e[i].v;
if(dep[v] == dep[u] + 1 && e[i].w) {
int k = dfs(v,min(now - ret,e[i].w));
e[i].w -= k;
e[i ^ 1].w += k;
ret += k;
if(now == ret) return ret;
}
}
return ret;
}
int dinic() {
int ans = 0;
while(bfs()) {
memcpy(cur,head,sizeof(cur));
ans += dfs(S,INF);
}
return ans;
}
int main() {
int n = read();
S = num(1,1);T = num(n + 1,n + 1);
for(int i = 1;i
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 501000,M = 10000000;
#define pi pair
ll read() {
ll x=0,f=1;char c=getchar();
while(c'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c,greater >q;
struct node {
int v,nxt,w;
}e[M];
int head[N],ejs;
void add(int u,int v,int w) {
e[++ejs].v = v;e[ejs].w = w;e[ejs].nxt = head[u];head[u] = ejs;
}
int S,T;
int dis[N],vis[N];
int dij() {
memset(dis,0x3f,sizeof(dis));
q.push(make_pair(0,S));
dis[S] = 0;
for(int i = 1;i dis[u] + e[i].w) {
dis[v] = dis[u] + e[i].w;
q.push(make_pair(dis[v],v));
}
}
}
return dis[T];
}
int main() {
int n = read();
int now;
S = n * n + 1,T = S + 1;
now = 1;
for(int i = 1;i
bzoj2007 NOI2010 海拔(对偶图)的更多相关文章
- [BZOJ2007][NOI2010]海拔(对偶图最短路)
首先确定所有点的海拔非0即1,问题转化成裸的平面图最小割问题,进而转化成对偶图最短路(同BZOJ1002). 这题的边是有向的,所以所有边顺时针旋转90度即可. 如下图(S和T的位置是反的). #in ...
- luogu2046[NOI2010]海拔 对偶图优化
luogu2046[NOI2010]海拔 对偶图优化 链接 https://www.luogu.org/problemnew/show/P2046 思路 海拔一定是0或者1,而且会有一条01交错的分界 ...
- 【BZOJ2007】[Noi2010]海拔 对偶图最短路
[BZOJ2007][Noi2010]海拔 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看 ...
- Bzoj2007 [Noi2010]海拔(平面图最短路)
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2742 Solved: 1318[Submit][Status] ...
- BZOJ2007 [Noi2010]海拔 【平面图最小割转对偶图最短路】
题目链接 BZOJ2007 题解 这是裸题啊,,要是考试真的遇到就好了 明显是最小割,而且是有来回两个方向 那么原图所有向右的边转为对偶图向下的边 向左的边转为向上 向下转为向左 向上转为向右 然后跑 ...
- BZOJ2007 NOI2010 海拔 平面图转对偶图 最小割
题面太长啦,请诸位自行品尝—>海拔 分析: 这是我见过算法比较明显的最小割题目了,很明显对于某一条简单路径,海拔只会有一次变换. 而且我们要最终使变换海拔的边权值和最小. 我们发现变换海拔相当于 ...
- bzoj千题计划129:bzoj2007: [Noi2010]海拔
http://www.lydsy.com/JudgeOnline/problem.php?id=2007 1.所有点的高度一定在0~1之间, 如果有一个点的高度超过了1,那么必定会有人先上坡,再下坡, ...
- BZOJ2007——[Noi2010]海拔
1.题意:一个裸的最小割 2.分析:直接转成对偶图最短路就好了,水爆了!(雾) #include <queue> #include <cstdio> #include < ...
- Bzoj2007 [Noi2010]海拔
Time Limit: 20 Sec Memory Limit: 552 MB Submit: 2380 Solved: 1130 Description YT市是一个规划良好的城市,城市被东西向 ...
随机推荐
- Day 6-2简单的socket通信
什么是socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面 ...
- jQuery 事件 - triggerHandler() 方法
定义和用法 triggerHandler() 方法触发被选元素的指定事件类型.但不会执行浏览器默认动作,也不会产生事件冒泡. triggerHandler() 方法与 trigger() 方法类似.不 ...
- JSON Support in PostgreSQL and Entity Framework
JSON 和JSONB的区别(What's difference between JSON and JSONB data type in PosgresSQL?) When should be use ...
- css3的clip-path方法剪裁实现
本例讲解如何通过clip-path把一个div(元素,可以是图片等)裁切成不同的形状,这里以一个div为例宽高均为300px 注意:不支持IE和Firefox,支持webkit浏览器,在现代浏览器中需 ...
- Navicat Preminum
此软件在连接的时候,需要这样: 新建链接==>连接属性==>编码选择自动==>如果此时点击确定的话,会把整个服务器的所有数据库都打开, 我们也可以只打开指定的数据库, 点击高级==& ...
- react 自我小计
1.react中的方法调用,在onClick事件中不需要加小括号. <button onClick={this.show}>方法的调用</button> show(){ con ...
- Jenkins+PowerShell持续集成环境搭建(七)构建触发器
Jenkins 有三种类型的构建触发器,如下图: Build after other projects are built:在其他项目构建后构建: Build periodically:定时构建: P ...
- JSON in SQL Server 2016
JSON functions in SQL Server enable you to analyze and query JSON data, transform JSON to relational ...
- HttpWebRequest using Basic authentication
System.Net.CredentialCache credentialCache = new System.Net.CredentialCache(); credentialCache.Add( ...
- hdu-3374(kmp+最小表示法)
题意:给你一个字符串,这个字符串我们可以把把他变成n个字符串按照以下规则:将当前字符串第一个放到字符串最后一位,字符串的下标依次向前推一位,比如:s[1] s[2 ]s[3] s[4]->s[2 ...