平面图最大流

建出对偶图,最短路即最大流

连接s,t形成的面为新的s,外围都是新的t,

有向图连边方向视情况而定

#include<cstdio>
#include<cstring>
#include<queue>
#define LL long long
#define INF 1000000000
using namespace std;

  LL dis[500000];
  int b[500000];
  int next[5000000],des[5000000],cnt=0,nd[500000],n;
  LL len[5000000];

  struct data{
      int num;
      LL dis;
       bool operator <(const data &a)const {
          return (a.dis<dis);
      }
  };
  priority_queue <data> heap;

  void addedge(int u,int v,int l){
      next[++cnt]=nd[u];nd[u]=cnt;
      des[cnt]=v;len[cnt]=l;
  }

  void build(){
      int t;
      memset(nd,-1,sizeof(nd));

      for (int i=1;i<=n+1;i++)
        for (int j=1;j<=n;j++){
               scanf("%d",&t);
               if (i==1) addedge((i-1)*n+j,n*n+1,t);else
               if (i==n+1) addedge(0,(i-2)*n+j,t);else
               addedge((i-1)*n+j,(i-2)*n+j,t);
        }

    for (int i=1;i<=n;i++)
     for (int j=0;j<=n;j++){
         scanf("%d",&t);
         if (j==0) addedge(0,(i-1)*n+j+1,t);else
         if (j==n) addedge(i*n,n*n+1,t);else
         addedge((i-1)*n+j,(i-1)*n+j+1,t);
     }

    for (int i=1;i<=n+1;i++)
      for (int j=1;j<=n;j++){
          scanf("%d",&t);
          if (i==1) addedge(n*n+1,(i-1)*n+j,t);else
          if (i==n+1) addedge((n-1)*n+j,0,t);else
          addedge((i-2)*n+j,(i-1)*n+j,t);
      }     

    for (int i=1;i<=n;i++)
      for (int j=0;j<=n;j++){
          scanf("%d",&t);
          if (j==0) addedge((i-1)*n+j+1,0,t);else
          if (j==n) addedge(n*n+1,(i-1)*n+j,t);else
          addedge((i-1)*n+j+1,(i-1)*n+j,t);
      }
  }

  void dij(){
      int tcnt;
      for (int i=0;i<=n*n+1;i++) {data t;t.num=i;t.dis=dis[i];heap.push(t);}

    while (!heap.empty()){
        data t=heap.top();
        heap.pop();
        if (b[t.num]) continue;
        for (int p=nd[t.num];p!=-1;p=next[p])
          if (dis[des[p]]>dis[t.num]+len[p]){
              tcnt++;
            dis[des[p]]=dis[t.num]+len[p];
            data tmp;tmp.num=des[p];tmp.dis=dis[des[p]];
            heap.push(tmp);
        }
        b[t.num]=1;
    }
  }

  int main(){
      scanf("%d",&n);

      build();
      a
      for (int i=1;i<500000;i++) dis[i]=1000000000;
      memset(b,0,sizeof(b));
      dis[0]=0;
    dij();

      printf("%lld",dis[n*n+1]);
  }//BZOJ2007
时间: 2024-11-07 17:32:15

平面图最大流的相关文章

BZOJ 1001 [BeiJing2006]狼抓兔子 平面图最大流

Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路是

s - t 平面图最大流

平面图性质 1.(欧拉公式)如果一个连通的平面图有n个点,m条边和f个面,那么f=m-n+2 2.每个平面图G都有一个与其对偶的平面图G* G*中的每个点对应G中的一个面 G*中的每个点对应G中的一个面 对于G中的每条边e e属于两个面f1.f2,加入边(f1*, f2*) e只属于一个面f,加入回边(f*, f*) 平面图G与其对偶图G*之间存在怎样的关系呢? G的面数等于G*的点数,G*的点数等于G的面数, G与G*边数相同 G*中的环对应G中的割一一对应 例题:BZOJ 1001 1001

20150726 填坑日记

三中内填坑: 1. 组合数递推什么的 C(m,n)=C(m,n-1)+C(m-1,n-1).填了个大坑,以前没认真听课QAQ 2. 裸题过河卒 3. 缺角正方形摆放车统计,分上下部分,枚举上部分放几个即可,O(n) 4. 3d立体图统计表面积:先把上下搞定,然后左右用高度差来统计即可.O(n^2) ===夏令营07.16神题=== 1. 求必经之路,枚举点,删点,BFS看能否到达终点,若不能则为必经点.O(nm) 2. 求生成树,使得生成树中最大边和最小边差最小.模仿kruskal,最小边固定,

怒刷BZOJ记录

我实在是太弱了...不滚粗只能刷BZOJ了...这里来记录每天刷了什么题吧. 2015-7-9 : 1001[BeiJing2006]狼抓兔子                 |最大流练习(呃..其实是平面图最大流辣) 1002[FJOI2007]轮状病毒                     |基尔霍夫矩阵算生成树数量(呃..其实是DP辣) 我先凑一下字数................................................

怒刷BZOJ记录(一)1001~1037

我实在是太弱了...不滚粗只能刷BZOJ了...这里来记录每天刷了什么题吧. 2015-7-9 : 1001[BeiJing2006]狼抓兔子                 | 最大流练习(呃..其实是平面图最大流辣) 1002[FJOI2007]轮状病毒                     | 基尔霍夫矩阵算生成树数量(呃..其实是DP辣) 2015-7-10: 1003[ZJOI2006]物流运输trans             | SPFA+DP 2015-7-11: 1004[H

bzoj 1001: [BeiJing2006]狼抓兔子 平面图最小割

平面图跑最大流 可以转换为其对偶图跑最短路 一个环对应一个割  找到最小环(即最短路)极为所求,注意辅助边的建立 加入读入优化  不过时间还是一般  估计是dij写的不好   大神勿喷~~~ /************************************************************** Problem: 1001 User: 96655 Language: C++ Result: Accepted Time:1724 ms Memory:95120 kb ****

【BZOJ1001】【BeiJing2006】狼抓兔子 最大流

Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路 1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路是

平面图最小割 对偶图

平面图最小割 对偶图: 平面图G的性质: (1)满足n个点,m条边,f个面 f = m - n + 2; (2)存在与其对应的对偶图G*; 对偶图:将原图中每个面变成一个点,外边界的无限大的面看成一个点,后连线即成对偶图: G的面数等于G*的点数,边数相等: 详解请看 最大最小定理(平面图最小割 对偶图)周冬 对于平面图的最大流(最小割)只需转化为对偶图,直接跑最短路即可: ps:觉得建图是最复杂的,各种RE(边数就是原来的边数,只是点数变成了原来的面数,,不注意就RE了):还有现在行数列数都变

平面图转换成对偶图的应用

转自:http://blog.sina.com.cn/s/blog_60707c0f01011fnn.html 一个图G=(V,E),若能将其画在平面上,且任意两条边的交点只能是G的顶点,则称G可嵌入平面,或称G是可平面的.可平面图在平面上的一个嵌入称为一个平面图.如下图左边黑色的图为平面图,右边红色的图不属于平面图: 由平面图的边包围而成,其中不含图的顶点.也称为面.包围面R的所有边组成的回路称为该面的边界,回路长度称为该面的度,记为deg(R).具有相同边界的面称为相邻面.由平面图的边包围且