# 80分(最小割)思路
先考虑如果没有题目中东南角为$1$那个限制的话会怎样。
那么只要让每个点的海拔都是$0$就行了。这样不论怎样走,最后的答案都是0.
然后再考虑那个东南角为$1$的限制表达了什么。其实说明了最后的答案一定是右下角一部分海拔全部为$1$,左上角一部分海拔全部为$0$。
所以这样只要找到分界点就行了。
这就是最小割的裸题啊。以$(1,1)$为起点,$(n+1,n+1)$为终点跑一遍最小割就行了。
# 100分(对偶图)思路
直接最小割过不去后面的大数据。所以要用对偶图优化一下。
平面图就是像题目中这样两条边的交点都是顶点的图。
如图
![](https://i.imgur.com/JLrLq31.png)
图中$9$个方格叫做平面图的面。对于一个平面图的对偶图,就是将平面图中的每个边两边的两个面连接起来。
上图的对偶图就长这样
![](https://i.imgur.com/Q6ETNSv.png)
红色部分就是对偶图了。
然后只要将原图转化成对偶图之后,跑最短路就行了。
# 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 海拔(对偶图)的更多相关文章

  1. [BZOJ2007][NOI2010]海拔(对偶图最短路)

    首先确定所有点的海拔非0即1,问题转化成裸的平面图最小割问题,进而转化成对偶图最短路(同BZOJ1002). 这题的边是有向的,所以所有边顺时针旋转90度即可. 如下图(S和T的位置是反的). #in ...

  2. luogu2046[NOI2010]海拔 对偶图优化

    luogu2046[NOI2010]海拔 对偶图优化 链接 https://www.luogu.org/problemnew/show/P2046 思路 海拔一定是0或者1,而且会有一条01交错的分界 ...

  3. 【BZOJ2007】[Noi2010]海拔 对偶图最短路

    [BZOJ2007][Noi2010]海拔 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看 ...

  4. Bzoj2007 [Noi2010]海拔(平面图最短路)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2742  Solved: 1318[Submit][Status] ...

  5. BZOJ2007 [Noi2010]海拔 【平面图最小割转对偶图最短路】

    题目链接 BZOJ2007 题解 这是裸题啊,,要是考试真的遇到就好了 明显是最小割,而且是有来回两个方向 那么原图所有向右的边转为对偶图向下的边 向左的边转为向上 向下转为向左 向上转为向右 然后跑 ...

  6. BZOJ2007 NOI2010 海拔 平面图转对偶图 最小割

    题面太长啦,请诸位自行品尝—>海拔 分析: 这是我见过算法比较明显的最小割题目了,很明显对于某一条简单路径,海拔只会有一次变换. 而且我们要最终使变换海拔的边权值和最小. 我们发现变换海拔相当于 ...

  7. bzoj千题计划129:bzoj2007: [Noi2010]海拔

    http://www.lydsy.com/JudgeOnline/problem.php?id=2007 1.所有点的高度一定在0~1之间, 如果有一个点的高度超过了1,那么必定会有人先上坡,再下坡, ...

  8. BZOJ2007——[Noi2010]海拔

    1.题意:一个裸的最小割 2.分析:直接转成对偶图最短路就好了,水爆了!(雾) #include <queue> #include <cstdio> #include < ...

  9. Bzoj2007 [Noi2010]海拔

    Time Limit: 20 Sec  Memory Limit: 552 MB Submit: 2380  Solved: 1130 Description YT市是一个规划良好的城市,城市被东西向 ...

随机推荐

  1. Day 6-2简单的socket通信

    什么是socket? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面 ...

  2. jQuery 事件 - triggerHandler() 方法

    定义和用法 triggerHandler() 方法触发被选元素的指定事件类型.但不会执行浏览器默认动作,也不会产生事件冒泡. triggerHandler() 方法与 trigger() 方法类似.不 ...

  3. JSON Support in PostgreSQL and Entity Framework

    JSON 和JSONB的区别(What's difference between JSON and JSONB data type in PosgresSQL?) When should be use ...

  4. css3的clip-path方法剪裁实现

    本例讲解如何通过clip-path把一个div(元素,可以是图片等)裁切成不同的形状,这里以一个div为例宽高均为300px 注意:不支持IE和Firefox,支持webkit浏览器,在现代浏览器中需 ...

  5. Navicat Preminum

    此软件在连接的时候,需要这样: 新建链接==>连接属性==>编码选择自动==>如果此时点击确定的话,会把整个服务器的所有数据库都打开, 我们也可以只打开指定的数据库, 点击高级==& ...

  6. react 自我小计

    1.react中的方法调用,在onClick事件中不需要加小括号. <button onClick={this.show}>方法的调用</button> show(){ con ...

  7. Jenkins+PowerShell持续集成环境搭建(七)构建触发器

    Jenkins 有三种类型的构建触发器,如下图: Build after other projects are built:在其他项目构建后构建: Build periodically:定时构建: P ...

  8. JSON in SQL Server 2016

    JSON functions in SQL Server enable you to analyze and query JSON data, transform JSON to relational ...

  9. HttpWebRequest using Basic authentication

    System.Net.CredentialCache credentialCache = new System.Net.CredentialCache(); credentialCache.Add( ...

  10. hdu-3374(kmp+最小表示法)

    题意:给你一个字符串,这个字符串我们可以把把他变成n个字符串按照以下规则:将当前字符串第一个放到字符串最后一位,字符串的下标依次向前推一位,比如:s[1] s[2 ]s[3] s[4]->s[2 ...