首先不难发现海拔高度只能为0或1

因为决策是单调的

不难发现最优决策一定是划分为海拔为0和1两块,不会出现01相间的情况

所以这很明显是一个最小割

由于n*n很大,我们必须要用平面图最小割转化为最短路径

在我们做1001时,是平面无向图,这里是平面有向图,其实是一样的

只要记住以起点终点为对角线划分外面为两个面,然后以面为点,边两侧面连边

最后注意新图的任意一条路径对应原图的一个割即可

最后答案就是最短路

 type node=record
       loc,num:longint;
     end;
     cmp=record
       point,next,cost:longint;
     end; var edge:array[..] of cmp;
    heap:array[..] of node;
    p,d,where:array[..] of longint;
    t,m,n,i,j,k,x,y,len:longint; procedure swap(var a,b:node);
  var c:node;
  begin
    c:=a;
    a:=b;
    b:=c;
  end; procedure add(x,y,z:longint);
  begin
    inc(len);
    edge[len].point:=y;
    edge[len].cost:=z;
    edge[len].next:=p[x];
    p[x]:=len;
  end; procedure up(i:longint);
  var j,x,y:longint;
  begin
    j:=i shr ;
    while j> do
    begin
      if heap[i].num<heap[j].num then
      begin
        x:=heap[i].loc;
        y:=heap[j].loc;
        where[x]:=j;
        where[y]:=i;
        swap(heap[i],heap[j]);
        i:=j;
        j:=i shr ;
      end
      else break;
    end;
  end; procedure sift(i:longint);
  var j,x,y:longint;
  begin
    j:=i shl ;
    while j<=m do
    begin
      if (j<m) and (heap[j].num>heap[j+].num) then inc(j);
      if heap[i].num>heap[j].num then
      begin
        x:=heap[i].loc;
        y:=heap[j].loc;
        where[x]:=j;
        where[y]:=i;
        swap(heap[i],heap[j]);
        i:=j;
        j:=i shl ;
      end
      else break;
    end;
  end; begin
  readln(n);
  fillchar(p,sizeof(p),);
  t:=n*n+;
  for i:= to n do
  begin
    readln(x);
    add(,i+,x);
  end;
  for i:= to n do
    for j:= to n do
    begin
      readln(x);
      if i=n then y:=t
      else y:=i*n+j+;
      add((i-)*n+j+,y,x);
    end;   for i:= to n do
  begin
    readln(x);
    add((i-)*n+,t,x);
    for j:= to n do
    begin
      readln(x);
      add((i-)*n+j+,(i-)*n+j,x);
    end;
    readln(x);
    add(,i*n+,x);
  end;   for i:= to n do
  begin
    readln(x);
    add(i+,,x);
  end;
  for i:= to n do
    for j:= to n do
    begin
      readln(x);
      if i=n then y:=t
      else y:=i*n+j+;
      add(y,(i-)*n+j+,x);
    end;   for i:= to n do
  begin
    readln(x);
    add(t,(i-)*n+,x);
    for j:= to n do
    begin
      readln(x);
      add((i-)*n+j,(i-)*n+j+,x);
    end;
    readln(x);
    add(i*n+,,x);
  end;
  m:=t;
  for i:= to t do
  begin
    if i= then d[i]:=
    else d[i]:=;
    heap[i].loc:=i;
    heap[i].num:=d[i];
    where[i]:=i;
  end;
  for i:= to t do
  begin
    k:=heap[].loc;
    if k=t then break;
    x:=heap[m].loc;
    where[x]:=;
    swap(heap[],heap[m]);
    dec(m);
    sift();
    j:=p[k];
    while j<>- do
    begin
      y:=edge[j].point;
      if d[y]>edge[j].cost+d[k] then
      begin
        d[y]:=edge[j].cost+d[k];
        heap[where[y]].num:=d[y];
        up(where[y]);
      end;
      j:=edge[j].next;
    end;
  end;
  writeln(d[t]);
end.

bzoj2007的更多相关文章

  1. 【bzoj2007】 Noi2010—海拔

    http://www.lydsy.com/JudgeOnline/problem.php?id=2007 (题目链接) 题意 $(n+1)*(n+1)$的网格图上,相邻两点间有一些人流.左上角点的海拔 ...

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

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

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

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

  4. 【BZOJ2007】【NOI2010】海拔(最小割,平面图转对偶图,最短路)

    [BZOJ2007][NOI2010]海拔(最小割,平面图转对偶图,最短路) 题面 BZOJ 洛谷 Description YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域. ...

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

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

  6. BZOJ2007/LG2046 「NOI2010」海拔 平面图最小割转对偶图最短路

    问题描述 BZOJ2007 LG2046 题解 发现左上角海拔为 \(0\) ,右上角海拔为 \(1\) . 上坡要付出代价,下坡没有收益,所以有坡度的路越少越好. 所以海拔为 \(1\) 的点,和海 ...

  7. bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路)

    bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路) 题目描述: bzoj  luogu 题解时间: 首先考虑海拔待定点的$h$都应该是多少 很明显它们都是$0$或$1$,并且所 ...

  8. BZOJ2007——[Noi2010]海拔

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

  9. 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)

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

  10. Bzoj2007 [Noi2010]海拔

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

随机推荐

  1. Oracle中not exists 与not in 的使用情况

    1.在oracle11g以上版本,oracle已经做了优化,能够自动将in优化成exists方式,因此oracle11g以上版本,使用in和exists效果是一样的. 2.在oracle中,使用not ...

  2. python learning_curve函数

    这个函数需要引用sklearn包 import sklearn from sklearn.learning_curve import learning_curve 这个函数的调用格式是: learni ...

  3. 31、三层架构、AJAX+FormsAuthentication实现登陆

    三层架构 前段时间公司要求修改一个网站,打开后我疯了,一层没有都是调用的DB接口,遍地的SQL语句,非常杂乱. 什么是三层架构? 三层架构是将整个项目划分为三个层次:表现层.业务逻辑层.数据访问层.目 ...

  4. 关于try和finaly 里面return的问题

    首先,下面这个方法调用: public int bbb(){ if(true){ return 3; } if(true){ return 4; } return 0; } 返回的结果是 :3 可见r ...

  5. red bottom shoes featured

    最近做了一个红底高根鞋的电商网站 Cheap Red Bottom Shoes Christian Louboutin Loafers Bestsellers Christian Louboutin ...

  6. codeblocks快捷键(转载)

    • 按住Ctrl滚滚轮,代码的字体会随你心意变大变小. • 在编辑区按住右键可拖动代码,省去拉(尤其是横向)滚动条之麻烦:相关设置:Mouse Drag Scrolling. • Ctrl+D可复制当 ...

  7. 利用XPath解析带有xmlns的XML文件

    在.net中,编写读取xml 的程序中提示"未将对象引用设置到对象的实例",当时一看觉得有点奇怪.为什么在读取xml数据的时候也要实例化一个对象.google了才知道,xml文件中 ...

  8. 使用css3画饼图

    CSS3 Gradient介绍参考地址: http://www.cnblogs.com/lhb25/archive/2013/01/30/css3-linear-gradient.html http: ...

  9. laravel学习前期遇到的小知识点(1)

    1. 目前我用的laravel 5.2.36版本web中间件成为全局中间件(不知道从5.2.26以上就改变了还是怎样,没有深究),也就是之前的版本路由里默认会有一个Route::group的web中间 ...

  10. android sdk api的层次结构

    一.系统级:android.accounts android.app     1.OS 相关         android.os         android.os.storage         ...