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 ...
随机推荐
- jq 点击按钮显示div,点击页面其他任何地方隐藏div
css .bl_rencai_32{ float: left; height: 35px; line-height: 35px; } .bl_rencai_32 >input{ width: 3 ...
- node.js+ react + redux 环境搭建
1.安装node.js 2. yarn init: 初始化,主要包含以下条目 name: 项目名 version: 版本号 description: 项目简要描述 entry point: 文件入口, ...
- 对Http协议基本原理的理解
超文本传输协议 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是 ...
- Java应用之POI
POI的简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. HSSF的概况 HSSF 是Horr ...
- 20175320 2018-2019-2 《Java程序设计》第5周学习总结
20175320 2018-2019-2 <Java程序设计>第5周学习总结 教材学习内容总结 本周学习了教材的第六章的内容.在这章中介绍了接口与实现,着重讲了接口是如何定义并实现以及如何 ...
- python文件派生
import time class Foo: x = 1 def __init__(self, y): self.y = y def __getattr__(self, item): # 没有的情况下 ...
- Markdown编辑工具及命令
Markdown是一种可以使用普通文本编辑器编辑的标记语言,通过使用简单的编辑,可以使文本具有一定的格式. Typora是一款简介的Markerdown编辑器. 文本编辑语法: 标题: # 一阶标题 ...
- RoR - Introduction to Active Record
Active Record: ORM ( Object-relational Mapping)Bridges the gap between relational databases , which ...
- angular--解决angular图片加载失败问题
基于angular4写的一个指令,在ionic3.x项目在用.因为加载图片超时等原因导致图片显示不出来,需要替换成默认或者指定图片 1.err-src.ts import { Directive,In ...
- 初步了解Fork/Join框架
框架介绍 Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个子任务,最终汇总每个子任务的执行结果以得到大任务结果的框架.Fork/Join框架要完成两件事 ...