Codefoces 277 E. Binary Tree on Plane
题目链接:http://codeforces.com/problemset/problem/277/E
参考了这篇题解:http://blog.csdn.net/Sakai_Masato/article/details/50775315
没看出来是费用流啊...我好菜啊。
我写得有一点和上面这篇题解不同:在判断是否无解时我直接记录最大流,判断最大流是否等于$n-1$(似乎是等价的...)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 1010
#define inf 0x7fffffff
#define llg int
#define sqr(_) ((_)*(_))
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m; struct node
{
llg u,v,c,next;
double w;
}; struct FLOW
{
llg cnt,maxflow,S,T,pre[maxn],N;
llg head[maxn],dl[maxn*maxn];
bool bj[maxn];
double mincost,dis[maxn];
node e[maxn*maxn]; void init()
{
memset(head,-,sizeof(head));
mincost=cnt=maxflow=;
maxflow=; mincost=;
} void link(llg u,llg v,double w,llg c)
{
e[cnt].u=u,e[cnt].v=v,e[cnt].w=w,e[cnt].c=c;
e[cnt].next=head[u],head[u]=cnt++; e[cnt].u=v,e[cnt].v=u,e[cnt].w=-w,e[cnt].c=;
e[cnt].next=head[v],head[v]=cnt++;
} void updata()
{
llg f=inf;
for (llg i=T;i!=S;i=e[pre[i]].u) f=min(f,e[pre[i]].c);
maxflow+=f;
for (llg i=T;i!=S;i=e[pre[i]].u)
{
e[pre[i]].c-=f;
e[pre[i]^].c+=f;
mincost+=(double)f*e[pre[i]].w;
}
} bool spfa()
{
llg u,v;
double w;
memset(pre,-,sizeof(pre));
memset(bj,,sizeof(bj));
for (llg i=;i<=N;i++) dis[i]=inf;
llg l=,r=;
dl[r]=S; bj[S]=; dis[S]=;
do
{
bj[u=dl[++l]]=;
for (llg i=head[u];i!=-;i=e[i].next)
{
v=e[i].v,w=e[i].w;
if (e[i].c && dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
pre[v]=i;
if (!bj[v]) bj[v]=,dl[++r]=v;
}
}
}while (l<r); if (pre[T]==-) return ;
return ;
} void work()
{
while (spfa())
updata();
} }G; inline int getint()
{
int w=,q=; char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar(); if(c=='-') q=,c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
} struct POINT{double x,y;}po[maxn]; bool cmp(const POINT&x,const POINT&y) {return x.y==y.y?x.x<y.x:x.y<y.y;} double dis(const POINT&x,const POINT&y) {return sqrt(sqr(x.x-y.x)+sqr(x.y-y.y));} int main()
{
yyj("flow");
cin>>n;
G.init();
G.N=n*+;
for (llg i=;i<=n;i++) scanf("%lf%lf",&po[i].x,&po[i].y);
sort(po+,po+n+,cmp);
reverse(po+,po++n);
for (llg i=;i<=n;i++)
for (llg j=i+;j<=n;j++)
if (po[i].y>po[j].y)
G.link(i,j+n,dis(po[i],po[j]),(llg));
G.S=*n+,G.T=*n+;
for (llg i=;i<=n;i++)
{
G.link(G.S,i,,(llg));
G.link(i+n,G.T,,(llg));
}
G.work();
if (G.maxflow!=n-) {cout<<-;} else printf("%.9lf",G.mincost);
return ;
}
Codefoces 277 E. Binary Tree on Plane的更多相关文章
- CF277E Binary Tree on Plane
CF277E Binary Tree on Plane 题目大意 给定平面上的 \(n\) 个点,定义两个点之间的距离为两点欧几里得距离,求最小二叉生成树. 题解 妙啊. 难点在于二叉的限制. 注意到 ...
- CF 277E Binary Tree on Plane (拆点 + 费用流) (KM也可做)
题目大意: 平面上有n个点,两两不同.现在给出二叉树的定义,要求树边一定是从上指向下,即从y坐标大的点指向小的点,并且每个结点至多有两个儿子.现在让你求给出的这些点是否能构成一棵二叉树,如果能,使二叉 ...
- 题解【CF277E Binary Tree on Plane】
Description 给你平面上 \(n\) 个点 \((2 \leq n \leq 400)\),要求用这些点组成一个二叉树(每个节点的儿子节点不超过两个),定义每条边的权值为两个点之间的欧几里得 ...
- LeetCode算法题-Average of Levels in Binary Tree(Java实现)
这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平 ...
- [LintCode] Invert Binary Tree 翻转二叉树
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- Leetcode 笔记 110 - Balanced Binary Tree
题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...
- Leetcode, construct binary tree from inorder and post order traversal
Sept. 13, 2015 Spent more than a few hours to work on the leetcode problem, and my favorite blogs ab ...
- [LeetCode] Find Leaves of Binary Tree 找二叉树的叶节点
Given a binary tree, find all leaves and then remove those leaves. Then repeat the previous steps un ...
随机推荐
- Oracle课程档案。第十一天
读一致性:oracle通过多版本与闪回机制保证读一致性.保证从某个时间点开始查询是一致的.在Oracle中主要通过SCN版本号来控制系统修改的版本,典型的例子是我们可以通过在同一个查询中得到同一个对象 ...
- python全栈开发 * 20 继承知识点汇总 * 180530
20 面向对象的三大特征之一(继承,多态,封装) -----继承 1.继承的定义: 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类;父类又可称为基类或超类,新建的类称为派生 ...
- String类,ThreadLocal
1,StringBuffer修改缓冲区的方法是同步的 单任务使用StringBuilder更有效 2,replace和replaceAll方法区别 3,spilt方法 a,b,c ...
- ASP.NET MVC Routing Debugger路由调试工具
官网地址:http://blog.csdn.net/sgear/article/details/6789882 To use this, simply download the following ...
- ffmpeg命令的使用
参考博客:https://www.cnblogs.com/wainiwann/p/4128154.html 但是红色网页总结的 “ffmpeg 用法” 非常全面. http://www.360doc. ...
- python字符串拼接
Python字符串拼接 在Python的实际开发中,很多都需要用到字符串拼接,python中字符串拼接有很多,今天总结一下: 用+符号拼接 用%符号拼接 用join()方法拼接 用format()方法 ...
- 271A
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h& ...
- linux affinity
现在的CPU几乎都是多核,所以,分配给予进程相同数量的线程是合理的需求 但是,这些线程不一定就均匀跑在这些内核上 所以,我们要指派,“一个线程就运行在一个固定的CPU内核上” //test.c #de ...
- docker安装配置gitlab详细过程
docker安装配置gitlab详细过程 获取镜像 1.方法一 1 docker pull beginor/gitlab-ce:11.0.1-ce.0 2.方法二如果服务器网路不好或者pull不下 ...
- AWS是怎么改写 MySQL的?
五倍吞吐量的提升,跨可用区的六副本,低于一分钟的宕机恢复,兼容 MySQL协议,这是 AWS 推出 Aurora 数据库时给出的数据. 这种量级的提升不可能是小修小补,大都是在架构上有了变革性的突破才 ...