Binary Tree on Plane【费用流】

2023-11-20

题目链接 CF 277 E


题意翻译

给你平面上 n 个点 (2≤n≤400),要求用这些点组成一个二叉树(每个节点的儿子节点不超过两个),定义每条边的权值为两个点之间的欧几里得距离。求一个权值和最小的二叉树,并输出这个权值。

其中,点 i 可以成为点 j 的的父亲的条件是:点 i 的 y 坐标比 j 的 y 坐标大。

如果不存在满足条件的二叉树,输出 −1 。


  我们知道二叉树所满足的性质,每个结点的根只有一个(除了根结点外),并且每个结点的子结点最多有两个,所以我们可以根据这两个信息来搭建网络流的框架。

  把每个点拆成两个点,分别代表的是“作为根”“作为子结点”。然后就方便连接了,那些可以作为二叉树上的边,肯定是由“作为根”的结点连接向“作为子结点”的结点的,并且权值也好确定,就是两者的欧几里得距离。然后每个点的子结点最多有两个,每个点的作为根结点最多一次。这两个限制条件用上,我们的一张图也就构建出来了。

  • 用S连接向“作为子结点”的结点,流为2,费用为0。表示的是每个结点最多有两个子结点;
  • 用“作为根”的结点连接向T,表示每个点只能作为根一次,当然,这里需要排除1这号根结点;
  • “作为根”的结点向可行的“作为子结点”的结点连接相关费用的边,流为1,费用为二者的欧几里得距离。

  图就这样建完了。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 1e9 + 7.
#define eps 1e-8
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
#define MP(a, b) make_pair(a, b)
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 8e2 + 7, maxM = 2e5 + 7;
int N, head[maxN], cnt;
pair<double, double> a[405];
inline bool cmp(pair<double, double> e1, pair<double, double> e2) { return e1.second == e2.second ? e1.first < e2.first : e1.second > e2.second; }
inline double _Dis(pair<double, double> e1, pair<double, double> e2) { return sqrt((e1.first - e2.first) * (e1.first - e2.first) + (e1.second - e2.second) * (e1.second - e2.second)); }
struct Eddge
{
    int nex, u, v; int flow; double cost;
    Eddge(int a=-1, int _u=0, int _v=0, int b=0, double c=0.):nex(a), u(_u), v(_v), flow(b), cost(c) {}
}edge[maxM];
inline void addEddge(int u, int v, int f, double c)
{
    edge[cnt] = Eddge(head[u], u, v, f, c);
    head[u] = cnt++;
}
inline void _add(int u, int v, int f, double c) { addEddge(u, v, f, c); addEddge(v, u, 0, -c); }
struct MaxFlow_MinCost
{
    int pre[maxN], S, T, sum_of_Flow; int Flow[maxN]; double dist[maxN];
    queue<int> Q;
    bool inque[maxN];
    inline bool spfa()
    {
        for(int i=0; i<=T; i++) { pre[i] = -1; dist[i] = INF; inque[i] = false; }
        while(!Q.empty()) Q.pop();
        Q.push(S); dist[S] = 0.; inque[S] = true; Flow[S] = INF;
        while(!Q.empty())
        {
            int u = Q.front(); Q.pop(); inque[u] = false;
            int f; double w;
            for(int i=head[u], v; ~i; i=edge[i].nex)
            {
                v = edge[i].v; f = edge[i].flow; w = edge[i].cost;
                if(f && dist[v] > dist[u] + w + eps)
                {
                    dist[v] = dist[u] + w;
                    Flow[v] = min(Flow[u], f);
                    pre[v] = i;
                    if(!inque[v])
                    {
                        inque[v] = true;
                        Q.push(v);
                    }
                }
            }
        }
        return ~pre[T];
    }
    inline double EK()
    {
        double sum_Cost = 0;
        while(spfa())
        {
            int now = T, las = pre[now];
            while(now ^ S)
            {
                edge[las].flow -= Flow[T];
                edge[las ^ 1].flow += Flow[T];
                now = edge[las].u;
                las = pre[now];
            }
            sum_Cost += dist[T] * Flow[T];
            sum_of_Flow += Flow[T];
        }
        return sum_Cost;
    }
} MF;
inline void init()
{
    cnt = 0; MF.S = 2 * N + 1; MF.T = MF.S + 1; MF.sum_of_Flow = 0;
    for(int i=0; i<=MF.T; i++) head[i] = -1;
    for(int i=1; i<=N; i++) _add(MF.S, N + i, 2, 0);
    for(int i=2; i<=N; i++) _add(i, MF.T, 1, 0);
}
int main()
{
    scanf("%d", &N);
    init();
    for(int i=1; i<=N; i++) scanf("%lf%lf", &a[i].first, &a[i].second);
    sort(a + 1, a + N + 1, cmp);
    if(a[1].second == a[2].second) { printf("-1\n"); return 0; }
    for(int i=1; i<=N; i++)
    {
        for(int j=i+1; j<=N; j++)
        {
            if(a[i].second == a[j].second) continue;
            _add(N + i, j, 1, _Dis(a[i], a[j]));
        }
    }
    double ans = MF.EK();
    if(MF.sum_of_Flow == N - 1) printf("%lf\n", ans);
    else printf("-1\n");
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Binary Tree on Plane【费用流】 的相关文章

  • 图论进阶指南-银河(差分约束/DAG/tarjan)

    测评地址 题目大意 第一行给出两个整数N和M 之后M行 每行三个整数T A B 表示一对恒星 A B 之间的亮度关系 恒星的编号从1开始 如果T 1 说明A和B亮度相等 如果T 2 说明A的亮度小于B的亮度 如果T 3 说明A的亮度不小于B
  • 【算法学习笔记】19:拓扑排序

    1 简述 计算拓扑序列的一个方式是 用BFS来尝试访问所有的节点 但是有一个约束就是只有入度为 0 0 0的节点才能被加入到扩展队列里 每次从队列里取出一个节点 也就同时在图中将这个节点拆除 所以它的所有后继的节点都减少 1 1 1 如果已
  • hdu 2586 How far away ?

    Problem acm hdu edu cn showproblem php pid 2586 Meaning 给一棵 n 个点的树 和 n 1 条边的边权 多次询问树上两点的距离 Analysis 以任意顶点为根 DFS 预处理出所有结点
  • 【构造】0617 Edge Split

    题意 给定一个 n n n 点 m m m 条边的无向连通图 其中 1
  • lambda

    外部变量访问方式说明符 不捕获任何变量 以引用方式捕获所有变量 用值的方式捕获所有变量 可能被编译器优化为const foo 以引用捕获foo 但其余变量都靠值捕获 foo 以值捕获foo 但其余变量都靠引用捕获 bar 以值方式捕获bar
  • 【斯坦福CS224W笔记之二】传统图机器学习的特征工程 — 节点

    Traditional Methods for ML on Graphs 是根据同济子豪兄学长的中文讲解做的笔记哦 感兴趣的话可以直接去b站观看详细视频 传送带 https github com TommyZihao zihao cours
  • [STL]vector常见用法详解

    目录 引入 常见用法介绍 1 vector的定义 2 vector容器内元素的访问 3 vector常用函数实例解析 1 push back 2 pop back 3 size 4 clear 5 insert 6 erase vector
  • hdu 5756:Boss Bo

    题目链接如下 Problem 5756 先用dfs确定每个节点的序号编号 并且可以获得每个节点可以包括的子树节点区间范围 再用线段树建立一棵树 在第一次建立的时候我们记录每个节点的深度 然后再进行一次dfs 这次dfs用来更新以不同节点为根
  • 无向图的遍历-BFS与DFS

    一 理论部分 无向图的遍历可用深度搜索 DFS 与广度搜索 BFS 深度搜索的基本方式是由图的一个节点1出发然后随机选一个与其相邻的节点2 接着在选择一个与其相邻的节点3 当一条路遍历完后再选择最近一个遍历过的 且相邻节点有未遍历过的节点
  • Codeforces Round 867 (Div. 3)(A题到E题)

    链接 Dashboard Codeforces Round 867 Div 3 Codeforces 头一次div3做出来四题 第五题也差临门一脚 赛后看到别人e题跟自己几乎一样的思路肠悔青了 还得练才行 A TubeTube Feed 签
  • 西安电子科技大学第二届程序设计新生赛-F-zxy的长跑【欧拉回路】

    题目链接 好极了的欧拉回路 我们想知道怎样才能跑完所有的边 我们可以从度为奇数的点出发 因为这是欧拉回路的无向图的先觉调节 当然 这道题还有另外一种可能就是这是一个环 1 gt 2 2 gt 3 3 gt 4 4 gt 1 那么就没有奇数度
  • 树形dp(例题)

    树的最长路径带权值 树的直径可能时红色的边 从上图可以看出 每次要两个变量存放以u为根 最长路径d1 和次长路径d2 那么整个树的最长路径就有可能是d1 d2 我们每次要返回以u为根的贯穿试的最长路径 给他的父节点判断使用如下图 inclu
  • The Stable Marriage Problem 【HDU - 1914】【稳定婚姻匹配问题】

    题目链接 Problem Description The stable marriage problem consists of matching members of two different sets according to the
  • [UVA1364

    评测地址 网址1 网址2 题目描述 题意 给出n位骑士 然后有m个关系 每个关系以格式 a b a b a b给出 表达骑士 a a
  • 迪杰斯特拉算法浅析

    所谓的迪杰斯特拉算法 就是一个用来求一个图中某点到其它点的最短路径的算法 大致方法 遍历所有节点 找到离起点最近的一个点 那么这个点到起点的最小距离肯定是起点到这个点的这条边的权值 然后标记这个点被使用过了 以1中的那个点为中继 更新其它节
  • [NOI 2015复习][BZOJ 1509][NOI 2003]逃学的小孩(树的直径)

    题目链接 http www lydsy com JudgeOnline problem php id 1509 题目大意 要从一棵树中找出三个点 X Y Z X Y Z 使得 min dis A C dis B C dis A B min
  • Codeforces Round #751 (Div. 2) D. Frog Traveler(BFS)

    题解 因为我们最多把所有的点跳一遍么 所以直接BFS模拟一下就行了 注意现在跳的点不能是以前已经跳过的点 并且只能越跳越高 否则没有意义 这样就保证了时间复杂度是线性的 AC代码 include
  • Two Arithmetic Progressions

    Two Arithmetic Progressions 题目链接 题意 思路 AC代码1 include
  • 数据结构算法—邻接表存储的无向图求连通分量个数

    数据结构算法 邻接表存储的无向图求连通分量个数 邻接表存储结构 typedef struct ArcNode int adjvex 边指向的顶点 struct ArcNode nextarc 下一条边的指针 ArcNode typedef
  • 坐标前后限制转点的坐标取值+网络流拆维拆点:agc031_e

    https vj imken moe contest 598718 problem J 观察到数据范围很小 但一个很重要的信息我们缺失了 就是珠宝的数量 所以我们考虑枚举珠宝的数量 k k k 对于横纵坐标什么至多至少的限制 比如 a i

随机推荐

  • 阿里巴巴都害怕的区块链电商到底是什么?

    近日 区块链权威机构中国通信工业协会区块链专业委员会 CCIAPCB 发出倡议 联合各界将中共中央政治局10月24日集体学习区块链主席讲话日作为 区块链中国日 此次中央将区块链技术放在了国家战略层面高度上 让区块链一时间成了全民热点 特别是
  • 【python数据挖掘课程】二十七.基于SVM分类器的红酒数据分析

    这是 Python数据挖掘课程 系列文章 前面很多文章都讲解了分类 聚类算法 这篇文章主要讲解SVM分类算法 同时讲解如何读取TXT文件数据并进行数据分析及评价的过程 文章比较基础 希望对你有所帮助 提供些思路 也是自己教学的内容 推荐大家
  • TS装饰器

    一 定义 装饰器本质是一种函数 通过添加标注的方式 对数据 类 方法 属性 参数等 的功能进行增加或者修改 二 使用 准备工作 ts config json文件中 1 基础使用 装饰器名字 例子 function test target a
  • 《塞尔达传说:旷野之息》中设计元素的分析

    塞尔达传说 旷野之息 中设计元素的分析 0 写在前面 关于 塞尔达传说 旷野之息 是否属于中型游戏 检索许多资料后 有一种通识是 塞尔达传说 旷野之息 不属于3A级别游戏 显然也不属于小型游戏 因此我姑且认为它属于中型游戏 这也符合此篇的初
  • crypto-js md5加密和解密

    直接上代码 import CryptoJS from crypto js const encodeFactor zq87dopenf67eg 加密 export function encrypt txt var key CryptoJS e
  • 服务攻防-中间件安全&CVE复现&IIS&Apache&Tomcat&Nginx漏洞复现

    目录 一 导图 二 ISS漏洞 中间件介绍 gt 1 短文件 2 文件解析 3 HTTP SYS 4 cve 2017 7269 三 Nignx漏洞 中间件介绍 gt 1 后缀解析漏洞 2 cve 2013 4547 3 cve 2021
  • openstack平台搭建笔记(容器云)

    openstack平台搭建笔记 容器云 一 根据要求准备好配置环境 节点IP 角色 备注 192 168 100 30 Master Kubernetes 集群 master 节点 Harbor 仓库节点 192 168 100 31 Wo
  • C# 快速写入日志 不卡线程 生产者 消费者模式

    有这样一种场景需求 就是某个方法 对耗时要求很高 但是又要记录日志到数据库便于分析 由于访问数据库基本都要几十毫秒 可在方法里写入BlockingCollection 由另外的线程写入数据库 可以看到 在我的机子上面 1ms写入了43条日志
  • html5 自动化测试工具,五大最佳自动化测试工具

    对更快交付高质量软件 或 快速质量 的需求要求组织以敏捷 持续集成 CI 和DevOps方法论来寻找解决方案 测试自动化是这些方面的重要组成部分 最新的 2018 2019年世界质量报告 表明 测试自动化是实现 快速质量 的最大瓶颈 因为它
  • 四位数显表头设计

    去年帮别人定制了一个四位数显小表头 可以用于测量4 20mA或者0 5V 0 10V输出的的各种传感器 可设置显示范围 上下限报警灯 由于后面更改方案 此方案暂时搁置不用 今天来分享一下软硬件的设计过程 1 硬件设计 1 1电源 电源采用一
  • Flink_06_ProcessAPI(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 侧输出流 SideOutput 即分支流 可以用来接收迟到数据 也可
  • SpringBoot实现接口版本控制

    一个系统在上线后会不断迭代更新 需求也会不断变化 有可能接口的参数也会发生变化 如果在原有的参数上直接修改 可能会影响到现有项目的正常运行 这时我们就需要设置不同的版本 这样即使参数发生变化 由于老版本没有变化 因此不会影响上线系统的运行
  • python的UnboundLocalError: local variable 'xxx' referenced before assignment

    From http blog sina com cn s blog 8d3652760101d01p html 一 意思 本地变量xxx引用前没定义 二 错误原因 在于python没有变量的声明 所以它通过一个简单的规则找出变量的范围 如果
  • OPENV接收和发送串口的数据

    import sensor image time from pyb import UART from pyb import Pin Timer LED import re sensor reset sensor set pixformat
  • qt 开发遇到的坑

    1 QString的toString 和toWString 引起的win32位release 下std string的析构崩溃 代码 QString qs std string str qs toStdString const wchar
  • Linux NFS说明,配置及故障分析

    一 NFS服务简介 NFS 是Network File System的缩写 即网络文件系统 一种使用于分散式文件系统的协定 由Sun公司开发 于1984年向外公布 功能是通过网络让不同的机器 不同的操作系统能够彼此分享个别的数据 让应用程序
  • MATLAB:figure的用法

    figure的定义 figure 创建图窗窗口 可以理解为创建一个有画板的窗口 我们在这块画板上绘制 plot 曲线等 figure主要是创建图窗窗口或者切换图窗窗口 figure n 查找到n存在时 将当前窗口切换成n 不存在时创建标识为
  • Java的String类、Object类、包装类

    1 String类 1 1 String类的两种实例化方式 1 直接赋值 String str hello 2 使用构造方法new的形式赋值 String str new String hello 1 2 String类定义的字符串的比较
  • Eclipse安装SVN插件

    http subclipse tigris org servlets ProjectProcess jsessionid A870EAC9A292637E167F9719F6399F60 pageID p4wYuA Installation
  • Binary Tree on Plane【费用流】

    题目链接 CF 277 E 题意翻译 给你平面上 n 个点 2 n 400 要求用这些点组成一个二叉树 每个节点的儿子节点不超过两个 定义每条边的权值为两个点之间的欧几里得距离 求一个权值和最小的二叉树 并输出这个权值 其中 点 i 可以成