码迷,mamicode.com
首页 > 其他好文 > 详细

网络流(平面图转对偶图)

时间:2018-04-03 21:58:38      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:图片   兔子   oj1001   http   ima   原来   body   ref   gpo   

https://zybuluo.com/ysner/note/1098815

标签(空格分隔): 网络流 最短路


知识点

这玩意儿大致的思路如下:
1.将源点到汇点中再补一条不与任何线段有交点的边。这条边把外侧无限大的区域划分为了两部分,一部分为S面,另外一部分为T面。(其实把那两个面当成两个点就成了)
2.平面图的任何一条边一定只与两个面相连,将这两个边相连,权值为边的边权
此时S?>T的最短路就是原来平面图中的最小割。

技术分享图片

伪证如下:(感性yy一下即可)
如果在对偶图上走了一条边,必定将原图中的一条边给割开
考虑一条S?>T的路径,
一定沿着S平面割开了若干平面,使得S平面与T平面相连
因此,一条路径是原图中的一个割
割的大小就是路径的长度
因此,最小割就是对偶图上的最短路(用最小的代价把一个图分成两半)

例题

T1[BZOJ1001]狼抓兔子

建边过程如下:

   fp(i,1,n)
    {
      fp(j,1,m-1)
      {
        re int u=S,v=T,w=gi();
        if(i!=1) v=id[ysn-1][j];//啥,没到上界,可以向上界yy?
        if(i!=n) u=id[ysn][j];//啥,没到下界,不是起点的地盘?
        add(u,v,w);add(v,u,w);
      }
      ysn+=2;
    }ysn=1;
  fp(i,1,n-1)
    {
      fp(j,1,m)
      {
     re int u=S,v=T,w=gi();
         if(j!=1) u=id[ysn][j-1];//啥,没到左界,不是起点的范围?
     if(j!=m) v=id[ysn+1][j];//啥,不是终点的范围?
     add(u,v,w);add(v,u,w);
      }
      ysn+=2;
    }ysn=1;
  fp(i,1,n-1)
    {
      fp(j,1,m-1)
    {
      re int u=id[ysn][j],v=id[ysn+1][j],w=gi();
      add(u,v,w);add(v,u,w);//不会越界,无需讨论
    }
      ysn+=2;
    }

就是把知识点那块模拟一遍。

未完待续

网络流(平面图转对偶图)

标签:图片   兔子   oj1001   http   ima   原来   body   ref   gpo   

原文地址:https://www.cnblogs.com/yanshannan/p/8710804.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!