P2711 小行星 (最大流)
题目
解析
这道题挺巧妙的,乍一看是空间上的,无从下手,稍微转换一下就可以了。
看到题目,求消除这些行星的最少次数,就是求最小割,也就是求最大流,考虑怎样建图。
考虑当我们消去一个面上的所有点时,我们消去这个面后,这个面就不会再被消了,也就是只能被消一次,比如我们消去与\(\texttt{x=1}\)垂直的面上的点后,与\(\texttt{x=1}\)垂直的这个面就不会被再消一次,\(\texttt{y,z}\)同理。
但在这个面上的某些点(\(\texttt{x}\)相同,\(\texttt{y}\),\(\texttt{z}\)不同的点)还会在另一些平面上,可能还会被再消。
直接连点的话会超时,我们考虑用点来代表面(例如\(\texttt{x}\)中的1号点就代表与\(\texttt{x=1}\)垂直的面),三个面就可以确定一个点,所以我们让\(\texttt{x}\)与\(\texttt{y}\)与\(\texttt{z}\)相连,表示这个点。
我们这样建图
建立一个超级汇点\(\texttt{s}\)和超级源点\(\texttt{t}\),\(\texttt{s}\)向所有\(\texttt{x}\)连边,\(\texttt{x}\)向\(\texttt{y}\)连边,\(\texttt{y}\)拆一下子点,拆完点出来向\(\texttt{z}\)连边,所有\(\texttt{z}\)向\(\texttt{t}\)连边。
当我们某一条\(\texttt{s->x}\)的边流满时,就代表与\(\texttt{x}\)垂直的这个面被消掉了,\(\texttt{y->y'}\)流满时表示与\(\texttt{y}\)垂直的这个面被消了,\(\texttt{z->t}\)流满时表示与\(\texttt{z}\)垂直的这个面被消了,因为我们要求最小割,所以跑一遍最大流就行了。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
const int INF = 0x3f3f3f3f;
int n, m, s, t, num = 1;
int head[N], cur[N], dep[N];
class node {
public :
int v, nx, w;
} e[N];
template<class T>inline void read(T &x) {
x = 0; int f = 0; char ch = getchar();
while (!isdigit(ch)) f |= (ch == '-'), ch = getchar();
while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar();
x = f ? -x : x;
return ;
}
inline void add(int u, int v, int w) {
e[++num].nx = head[u], e[num].v = v, e[num].w = w, head[u] = num;
e[++num].nx = head[v], e[num].v = u, e[num].w = 0, head[v] = num;
}
queue<int>q;
bool bfs() {
memset(dep, 0, sizeof dep);
memcpy(cur, head, sizeof cur);
dep[s] = 1;
q.push(s);
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = head[u]; ~i; i = e[i].nx) {
int v = e[i].v;
if (!dep[v] && e[i].w) dep[v] = dep[u] + 1, q.push(v);
}
}
return dep[t];
}
int dfs(int u, int flow) {
if (u == t) return flow;
int use = 0;
for (int &i = cur[u]; ~i; i = e[i].nx) {
int v = e[i].v;
if (e[i].w && dep[v] == dep[u] + 1) {
int di = dfs(v, min(flow, e[i].w));
e[i].w -= di, e[i ^ 1].w += di;
use += di, flow -= di;
if (flow <= 0) break;
}
}
return use;
}
int dinic() {
int ans = 0;
while (bfs()) ans += dfs(s, INF);
return ans;
}
int main() {
memset(head, -1, sizeof head);
read(n), read(m);
for (int i = 1, x, y, z; i <= n; ++i) read(x), read(y), read(z), add(x, y, z);
s = 1, t = m;
printf("%d\n", dinic());
}
P2711 小行星 (最大流)的更多相关文章
- [洛谷P2711]小行星
题目大意:有$n$颗行星,每颗行星的位置是$(x,y,z)$.每次可以消除一个面(即$x,y$或$z$坐标相等)的行星,求消除这些行星的最少次数. 题解:最小割,对于每一颗小行星,从 x 面的出点向 ...
- 【Luogu2711】小行星(网络流,最大流)
[Luogu2711]小行星(网络流,最大流) 题面 题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最 ...
- AC日记——小行星 洛谷 P2711
题目背景 pid=3437 题目描述 星云中有n颗行星,每颗行星的位置是(x,y,z).每次可以消除一个面(即x,y或z坐标相等)的行星,但是由于时间有限,求消除这些行星的最少次数. 输入输出格式 输 ...
- bzoj1741 [Usaco2005 nov]Asteroids 穿越小行星群 最小点覆盖
链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1741 思路 消除所有的小行星 每个点(x,y)只有选择x或者y才能被覆盖 二分图最小点覆盖= ...
- 使用C#处理基于比特流的数据
使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- FILE文件流的中fopen、fread、fseek、fclose的使用
FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
随机推荐
- React 版本16.9.0 中配置路由以及路由传参
我的脚手架版本如下: "dependencies": { "antd": "^3.21.4", "jquery": &q ...
- mybatis查询mysql的datetime类型数据时间差了14小时
场景: 数据库字段: mybatis使用 now() 生成时间. 结果: 使用mybatis查询mysql中的数据时,所有时间都比数据库时间多了14小时,考虑了一下,初步判定是系统时区的问题.因为my ...
- BGP MPLS IP V匹N基本概念
BGP/MPLS IP VPN基本概念 Site 在介绍VPN时经常会提到"Site",Site(站点)的含义可以从下述几个方面理解: · Site是指相互之间具备IP连通性的一组 ...
- jstl标签库使用报错index_jsp.java找不到问题
初学jstl的时候记得只需要讲jstl和standard的jar放在lib下面,然后jsp中使用对应导入语法就可以使用标签库了. 但那时候用的是myeclipes,myeclipes的导包的过程记得是 ...
- 解决 No IDEA annotations attached to the JDK 1.8和xml文件没有代码提示
Android studio3.3 用着用着突然xml里没有代码联想了,忙着做其他的就没管,写xml的时候就硬写... 然后今天用着突然在class文件上方提示No IDEA annotations ...
- osgearth显示中文标签
首先将带有中文的字符串转换成string void unicodeToUTF8(const wstring &src, string& result){int n = WideChar ...
- MSSQL Server 及 MSSQL Express版本 自动备份
一.SQL Server Management Studio(SMSS) 维护计划 [参考]SQL SERVER如何定期自动备份数据库 二.Windows 级 任务计划程序( MSSQL Expres ...
- JDK8:Lambda根据 单个字段、多个字段,分组求和
使用lambda表达式分别 根据 单个字段.多个字段,分组求和 示意图: 1.根据 单个字段,分组求和:根据2019这个字段,计算一个list集合里,同属于2019的某个字段累加和 2.根据 多个字段 ...
- Nginx 配置学习
官方文档 一.概述 Nginx的配置放在配置文件nginx.conf/etc/nginx/nginx.conf中,大概的结构如下: main # 全局配置 events { # nginx工作模式配置 ...
- spring boot2X整合Consul一服务注册与发现
Consul 是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置. 关键特性: 服务注册/发现 数据强一致性保证 多数据中心 健康检查 key/value存储 1.下载 htt ...