从一条边出发遍历,每次找旋转角度最小的一条边作为下一条边,直到回到出发的边,就得到了一个区域。这样建出对偶图后跑不定根的最小树形图就行了。

#include<cstdio>
#include<cmath>
#include<map>
#define ub upper_bound
using namespace std;
const int N=5005;
map<double,int>s[N];
int sum,n,m,q[N],v[N];
struct edge{
int v,w;
edge*s;
}e[N*2];
edge*l=e,*h[N];
void add(int u,int v,int w){
sum+=w;
edge s={v,w,h[u]};
*(h[u]=l++)=s;
}
struct vec{
int x,y;
double a;
vec(){}
vec(int x,int y):x(x),y(y),a(atan2(y,x)){}
}a[N];
vec operator-(vec a,vec b){
return vec(a.x-b.x,a.y-b.y);
}
namespace dual{
struct edge{
int u,v,w;
}e[N*2];
edge*l=e;
void add(int u,int v,int w){
edge s={u,v,w};
*l++=s;
}
int d[N],p[N],s[N],t[N];
int find(int&v){
for(int i=1;i!=n;++i){
s[i]=0;
d[i]=1e9;
}
for(edge*i=e;i!=l;++i)
if(d[i->v]>i->w){
p[i->v]=i->u;
d[i->v]=i->w;
}
int now=0;
for(int i=1;i!=n;++i){
v+=d[i];
int u=i;
for(;u&&!s[u];u=p[u])
s[u]=i;
now+=s[u]==i;
for(;s[u]==i;u=p[u]){
s[u]=-1;
t[u]=now;
}
}
return now;
}
int sol(int v){
while(int now=find(v)){
for(int i=1;i!=n;++i)
if(~s[i])t[i]=++now;
n=now+1;
edge*q=l;
for(edge*i=l=e;i!=q;++i)
if(t[i->u]!=t[i->v])
add(t[i->u],t[i->v],i->w-d[i->v]);
}
return v;
}
}
struct buf{
char z[1<<20],*s;
buf():s(z){
z[fread(z,1,sizeof z,stdin)]=0;
}
operator int(){
int x=0,y=0;
while(*s<48)
if(*s++==45)y=1;
while(*s>32)
x=x*10+*s++-48;
return y?-x:x;
}
}it;
int sol(){
for(int i=1;i<=n;++i)
for(edge*j=h[i];j;j=j->s)
s[i][(a[j->v]-a[i]).a]=j-e;
for(int i=1;i<=n;++i)
for(edge*j=h[i];j;j=j->s){
typeof(s->end())u=s[j->v].ub((a[i]-a[j->v]).a);
if(s[j->v].end()==u)
u=s[j->v].begin();
q[j-e]=u->second;
}
using dual::add;
using dual::sol;
int&now=n=1;
for(edge*i=e;i!=l;++i)
if(!v[i-e]){
for(int j=i-e;!v[j];j=q[j])
v[j]=now;
add(0,now++,sum);
}
for(edge*i=e;i!=l;++i)
if(i->w)
add(v[i-e^1],v[i-e],i->w);
return sol(-sum);
}
int main(){
n=it,m=it;
for(int i=1;i<=n;++i){
a[i].x=it;
a[i].y=it;
}
while(m--){
int s=it,t=it;
add(s,t,it);
add(t,s,it);
}
printf("%d\n",sol());
}

BZOJ2960: 跨平面的更多相关文章

  1. BZOJ2960:跨平面

    题面 BZOJ Sol 对该平面图的对偶图建图后就是最小树形图,建一个超级点向每个点连 \(inf\) 边即可 怎么转成对偶图,怎么弄出多边形 把边拆成两条有向边,分别挂在两个点上 每个点的出边按角度 ...

  2. 高速LVDS电平简介

    一.LVDS简介 1.1.LVDS信号介绍LVDS:Low Voltage Differential Signaling,低电压差分信号.LVDS传输支持速率一般在155Mbps(大约为77MHZ)以 ...

  3. PCB设计工程师面试题

    网上的一套PCB设计工程师面试题,测下你能不能拿90分?  [复制链接]           一.填空 1.PCB上的互连线按类型可分为()和() . 2.引起串扰的两个因素是()和(). 3.EMI ...

  4. layout焊盘过孔大小的设计标准

    PCB设计前准备 1.准确无误的原理图.包括完整的原理图文件和网表,带有元件编码的正式的BOM.原理图中所有器件的PCB封装(对于封装库中没有的元件,硬件工程师应提供datasheet或者实物,并指定 ...

  5. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  6. 最小割&网络流应用

    重要链接 基础部分链接 : 二分图 & 网络流初步 zzz大佬博客链接 : 网络流学习笔记 重点内容:最小割二元关系新解(lyd's ppt) 题目:网络流相关题目 lyd神犇课件链接 : 网 ...

  7. 平面内,线与线 两条线找交点 两条线段的位置关系(相交)判定与交点求解 C#

    个人亲自编写.测试,可以正常使用   道理看原文,这里不多说   网上找到的几篇基本都不能用的   C#代码 bool Equal(float f1, float f2) { return (Math ...

  8. 在路上:安全公司“跨界”SD-WAN

    编者按:本文是SDNLAB“企业+”特别报道之一.“企业+”是SDNLAB重点打造的栏目,汇聚信息行业运营商.设备商.互联网公司.软件公司.集成公司.融创投资公司.科研院所等企业,重新定义IT行业撮合 ...

  9. Luogu P1429 平面最近点对 【分治】By cellur925

    题目传送门 题目大意:给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的.$n$<=100000. $Algorithm$ 最朴素的$n^2$枚举肯定 ...

随机推荐

  1. [BZOJ3142][HNOI2013]数列(组合)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3142 分析: 考虑差值序列a1,a2,...,ak-1 那么对于一个确定的差值序列,对 ...

  2. javascript代码片段

    DOMReady函数,只要DOM结构加载完成即可,不必等待所有资源加载完成,节约时间,"DOMContentLoaded"在H5中被标准化 var DOMReady=functio ...

  3. 东大oj-1591 Circle of friends

    题目描述 Nowadays, "Circle of Friends" is a very popular social networking platform in WeChat. ...

  4. 局域网IP段

    局域网的出现,一方面解决内部安全问题,另一个方面解决ipv4不够用的问题.局域网方便维护和管理,目前局域网Ip地址段为 局域网地址范围分三类: C类:192.168.0.0-192.168.255.2 ...

  5. c/c++模板的定义和实现分开的问题及其解决方案

    注意c/c++模板的定义和实现- -                                       定义一个类一般都是在头文件中进行类声明,在cpp文件中实现,但使用模板时应注意目前的C ...

  6. Maven遇到的错误汇总

    使用工具是MyEclipse10: 1.创建Maven项目出错 1.项目名带有Maven Webapp 解决方案: 2.缺少jar could not resolve archetype :   Co ...

  7. AndroidPn

    客户端的主要包说明 org.androidpn.client包下的文件 public class Constants {  //包含静态数据 public class InvalidFormatExc ...

  8. 02python算法-二分法简介

    老规矩: 什么是二分法: 其实是一个数学领域的词,但是在计算机领域也有广泛的使用. 为什么需要二分法? 当穷举算法性能让你崩溃时. 二分法怎么用呢? 让我们先玩一个游戏先,我心里想一个100以内的整数 ...

  9. jquery 双击修改某项值

    双击修改某项值 $(function() { $('td.breakword').dblclick(function(){ $(this).addClass('input').html('<in ...

  10. java-二维码编写zxing

    zxing 这个是google的 下载地址 http://code.google.com/p/zxing/downloads/list 二维码源码案例 package com.utils; impor ...