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

#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. CSS中margin与padding的区别

    CSS边距属性定义元素周围的空间.通过使用单独的属性,可以对上.右.下.左的外边距进行设置.也可以使用简写的外边距属性同时改变所有的外边距.——W3School 边界(margin):元素周围生成额外 ...

  2. mybatis自动生成代码

    使用maven集成mybatis-generator插件生成Mybatis的实体类,DAO接口和Map映射文件 本例中,使用的是mysql数据库 前提:表已经建好  mybatis框架的jar包,数据 ...

  3. Jquery.min.js 下载

    Jquery 下载:http://www.jq22.com/jquery-info122

  4. codevs1227

    费用流,其实是求传输一个容量为k的流的最大费用.主要是建图.原点为0,和1连上一条容量为k,费用为0的边,中间每个点拆成两个1和2,连上一条边,容量为k,费用为c,再连一条容量为比k大,费用为0的边, ...

  5. 【USACO 1.4】Arithmetic Progressions

    /* TASK: ariprog LANG:C++ URL:http://train.usaco.org/usacoprob2?a=PA9lOcZrdWq&S=ariprog SOLVE:平方 ...

  6. UIScrollView 实践经验(转)

    转载自:http://tech.glowing.com/cn/practice-in-uiscrollview/ UIScrollView(包括它的子类 UITableView 和 UICollect ...

  7. C语言中数组名作为参数进行函数传递

    用数组名作函数参数与用数组元素作实参有几点不同. 1) 用数组元素作实参时,只要数组类型和函数的形参变量的类型一致,那么作为下标变量的数组元素的类型也和函数形参变量的类型是一致的.因此,并不要求函数的 ...

  8. 欢迎加入.Net高级部落 173844862

    本群成立至今3年多,聚集了好多大牛级别的人物,欢迎高手前来指教,也欢迎小菜鸟进来学习.群成员热情开朗,有问必答.在这里聊聊技术,谈谈理想,不光技术会得到提高,也会收获一大帮志同道合的朋友,希望在未来的 ...

  9. 解决虚拟机 MAC10.9 不能设置1366*768分辨率问题

    首先在虚拟机设置里,显示--3d下面--固定分辨率--最大设成1024*768--保存然后打开虚拟机的.vmx文件,最后几行 svga.autodetect = "FALSE"sv ...

  10. JAVA判断各种类型数据是否为空

    1.判断list是否为空(Map.Set同list) if(list != null && list.size() == 0){ } if(list != null && ...