今天写了两道网络流的经典例题,总结一下两道题的做法。
宣传一波个人博客

二维小行星 POJ3041

题目大意:

给你nnn个小行星的坐标(x,y)(x,y)(x,y) ,$ 1 \leq n \leq 500 ,x,y \leq n$

你每次可以消除某一行或某一列的小行星,求最少消除次数。

题解

把每个x,yx,yx,y分开做节点,对于每一个小行星(x,y)(x,y)(x,y),把xxx节点和yyy节点连一条边,那么题目

变成了要我们求最小点覆盖了,那么可以直接转化成网络流来做。

/*******************************
Author:galaxy yr
LANG:C++
Created Time:2019年09月28日 星期六 21时35分41秒
*******************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>using namespace std;struct edge{int to,next,w;
};const int maxn=505;
const int inf=0x7fffffff;
int n,k,head[maxn*3],cnt,s,t,depth[maxn*3],dis[maxn*3];
edge e[maxn*maxn];void add(int u,int v,int w)
{e[cnt].to=v;e[cnt].next=head[u];e[cnt].w=w;head[u]=cnt++;
}bool bfs()
{memset(depth,-1,sizeof depth);depth[s]=0;std::queue<int>q;q.push(s);while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i!=-1;i=e[i].next)if(depth[e[i].to]==-1 && e[i].w>0){depth[e[i].to]=depth[u]+1;q.push(e[i].to);}}return depth[t]!=-1;
}int dfs(int u,int dist)
{if(u==t)return dist;for(int i=head[u];i!=-1;i=e[i].next)if(depth[e[i].to]==depth[u]+1 && e[i].w>0){int d=dfs(e[i].to,min(dist,e[i].w));if(d>0){e[i].w-=d;e[i^1].w+=d;return d;}}return 0;
}int Dinic()
{int ans=0;while(bfs())while(int d=dfs(s,inf))ans+=d;return ans;
}int main()
{freopen("poj3047.in","r",stdin);freopen("poj3047.out","w",stdout);memset(head,-1,sizeof head);cin>>n>>k;s=n+n+1;t=n+n+2;for(int i=1;i<=n;i++){add(s,i,1);add(i,s,0);add(i+n,t,1);add(t,i+n,0);}int u,v;for(int i=1;i<=k;i++){cin>>u>>v;add(u,v+n,1);add(v+n,u,0);}cout<<Dinic()<<endl;return 0;
}

升级为三维 洛谷 P2711

题目大意:

给你nnn个小行星的坐标(x,y,z)(x,y,z)(x,y,z) ,$ 1 \leq n \leq 50000 ,1 \leq x,y \leq 500$

你每次可以消除某一个平面的小行星,求最少消除次数。

题解

考虑把x,y,zx,y,zx,y,z分开做节点,然后对于每一个小行星(x,y,z)(x,y,z)(x,y,z)坐标之间连边,那么消除一个平面即

为断一条边的代价,题目即要求我们求最小割。(连边还是很简单的,可以自己想一想)

/*******************************
Author:galaxy yr
LANG:C++
Created Time:2019年09月29日 星期日 10时31分05秒
*******************************/
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>using namespace std;struct edge{int to,next,w;edge(int a=0,int b=0,int c=0):to(a),next(b),w(c){}
};const int maxn=505;
const int maxm=50005;
const int N=500;
const int _2N=1000;
const int _3N=1500;
const int inf=0x7fffffff;
int n,head[maxn*5],s=_3N+N+1,t=_3N+N+2,depth[maxn*5],cnt;
edge e[maxm*10];void add(int u,int v,int w)
{e[cnt]=edge(v,head[u],w);head[u]=cnt++;
}void Add(int u,int v,int w)
{add(u,v,w);add(v,u,0);
}bool bfs()
{memset(depth,-1,sizeof depth); depth[s]=0;queue<int>que; que.push(s);while(!que.empty()){int u=que.front(); que.pop();for(int i=head[u];i!=-1;i=e[i].next)if(e[i].w>0 && depth[e[i].to]==-1){depth[e[i].to]=depth[u]+1;que.push(e[i].to);}}return (depth[t]>=0);
}int dfs(int now,int dist)
{if(now==t)return dist;for(int i=head[now];i!=-1;i=e[i].next)if(e[i].w>0 && depth[e[i].to]==depth[now]+1){int d=dfs(e[i].to,min(dist,e[i].w));if(d>0){e[i].w-=d;e[i^1].w+=d;return d;}}return 0;
}int Dinic()
{int ans=0;while(bfs())while(int d=dfs(s,inf))ans+=d;return ans;
}int main()
{freopen("p2711.in","r",stdin);freopen("p2711.out","w",stdout);memset(head,-1,sizeof head);cin>>n;int x,y,z;for(int i=1;i<=n;i++){cin>>x>>y>>z;Add(x,y+N,inf);Add(y+N,y+_2N,1);Add(y+_2N,z+_3N,inf);}for(int i=1;i<=N;i++){Add(s,i,1);Add(i+_3N,t,1);}cout<<Dinic()<<endl;return 0;
}

网络流例题-小行星二维到三维相关推荐

  1. R语言plotly可视化:使用PCA算法进行数据降维、使用plotly可视化PCA所有的主成分绘制散点图矩阵、降维后的两个(三个)核心主成分的二维、三维可视化图形、方差解释的量、载荷图等

    R语言plotly可视化:使用PCA算法进行数据降维.使用plotly可视化PCA所有的主成分绘制散点图矩阵.降维后的两个(三个)核心主成分的二维.三维可视化图形.方差解释的量.载荷图等 目录

  2. linux c语言 malloc动态分配指针,C语言malloc函数为一维,二维,三维数组分配空间...

    c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...

  3. 从二维到三维,可见Web3D技术的重要性,让线上3D产品展示所见即所得

    原文地址:Web3D技术|从二维到三维,所见即所得 导读: 从2D到3D图像展示,从二维平面到三维立体,为我们实现了所见即所得.你是否想过有一天,我们能在网购时看到真实产品的每一个细节,仿佛产品就在你 ...

  4. Android 高级UI解密 (三) :Canvas裁剪 与 二维、三维Camera几何变换(图层Layer原理)

    Android的绘图机制是核心内容之一,无论是什么样的功能最终都是以图像的形式呈现给用户.因此掌握Android的绘图技巧,有助于Android理解层次的提高,在面对产品经理提出的idea时也更有底气 ...

  5. 类的设计与实现1、设计一个图形抽象类Graph,该类中有成员变量图形类型(type),维度信息(dimension,二维或三维);成员方法计算面积(computeArea); 2、设计一个接口

    类的设计与实现 1.设计一个图形抽象类Graph,该类中有成员变量图形类型(type),维度信息(dimension,二维或三维):成员方法计算面积(computeArea); 2.设计一个接口IDi ...

  6. k-means聚类、以及二维、三维可视化

    说明 最近做聚类分析,记录一下聚类后,利用PCA将特征降维到二维.三维,进行聚类可视化的方法 数据处理和EDA部分就不放在这里了,有兴趣的可以点击下方链接看完整的项目,fork后可以看到完整代码,可下 ...

  7. N圆最密堆积、最小外接正方形的matlab求解(二维、三维等圆Packing 问题)

    圆形最密堆积.最小外接正方形的matlab求解(二维.三维等圆Packing 问题) 0 前言 1 N个圆的最小外接正方形求解 2 N个球的最小外接立方体求解 惯例声明:本人没有相关的工程应用经验,只 ...

  8. c语言malloc申请三维数组,C语言malloc函数为一维,二维,三维数组分配空间

    c语言允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不必在程序的声明部分定义,也不必等到函数结束时才释放,而是需要时随时开辟,不需要时随时释放,这些数据存储在堆区.可以根据需要,向系统申请 ...

  9. matlab二维、三维矩阵转换、排序、转置等问题

    1.matlab二维转换为三维矩阵 这里用到reshape函数 格式为AA1=reshape(A1,[行,列,页]) 如下所示 A1=[2 2 2 2 2.5 2.5 2.5 2.5 1.8 1.8 ...

最新文章

  1. python画图保存成html格式、用浏览器打开页面为空白_解决pyecharts运行后产生的html文件用浏览器打开空白...
  2. 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)
  3. 引:善用backtrace解决大问题
  4. QML笔记-对QML中信号与槽的进一步认识
  5. Elasticsearch】es memory locking requested for process but memory is not locked
  6. idea package自动生成_IDEA -- 自动创建POJO
  7. 2. SpringBoot +Mybaits
  8. 解决Ubuntu下Sublime Text 3无法输入中文
  9. python机器学习生物信息学-疾病预测模型
  10. Java中的编译、反编译和反编译工具全家桶分享
  11. 为什么acdsee服务器怎在运行,为何打开网页时会出现安装acdsee 5.0.1 powerpack
  12. 毕业论文答辩技巧及注意事项(附答辩自述模板)~
  13. 2016word多级列表 一级标题居中后偏左
  14. C语言标准ANSI C、C语言的特点、C语言的关键字(32个)
  15. 程序员的三大优良品质:偷懒,没有耐性和骄傲自大。
  16. java后端系统学习总结 01_java第五版 java初学笔记,由浅入深
  17. 王佩丰 Excel 基础24讲 | 学习笔记(全)
  18. java导出excel 提示文件格式或文件扩展名有误
  19. 如果有人证明出来哥德巴赫猜想会有啥成就?
  20. Linux 远程桌面 速度快,虫洞TCP加速,提升远程桌面和SSH访问速度

热门文章

  1. 常用路由器默认密码集合
  2. 甲骨文oracle测试面试记录
  3. C语言:输出n行由大写字母A开始构成的三角形字符阵列。
  4. 第四周——爬虫入门 Day3 7.20
  5. 啥是BGP机房啊,被科普一下!
  6. 库存融资管理系统-覆盖全行业几十种第三方接口
  7. IOS截屏的几种方法
  8. iterm快捷键及操作技巧(附Linux快捷键)
  9. mysql slap_mysqlslap压力测试介绍
  10. 面向对象--封装、构造方法