BZOJ2960 : 跨平面

平面图求域之后增加超级根,然后建图求最小树形图即可。

#include<cstdio>
#include<cmath>
#include<set>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=3010,M=10010,inf=0x7fffffff;
int n,m,q,cnt,i,x,y,z1,z2;
struct P{
  int x,y;
  P(){}
  P(int _x,int _y){x=_x,y=_y;}
  ll operator*(const P&b){return 1LL*x*b.y-1LL*y*b.x;}
}a[N],b[M];
struct E{
  int x,y,z;double o;
  E(){}
  E(int _x,int _y,int _z){x=_x,y=_y,z=_z,o=atan2(a[y].x-a[x].x,a[y].y-a[x].y);}
}e[M];
bool del[M];int from[M];
namespace GetArea{
struct cmp{bool operator()(int a,int b){return e[a].o<e[b].o;}};
set<int,cmp>g[N];set<int,cmp>::iterator k;int i,j,q[M],t;
void work(){
  for(i=0;i<m+m;i++)if(!del[i]){
    for(q[t=1]=j=i;;q[++t]=j=*k){
      k=g[e[j].y].find(j^1);k++;
      if(k==g[e[j].y].end())k=g[e[j].y].begin();
      if(*k==i)break;
    }
    ll s=0;
    for(j=1;j<=t;j++)s+=a[e[q[j]].x]*a[e[q[j]].y],del[q[j]]=1;
    if(s<0)continue;
    for(cnt++,j=1;j<=t;j++)from[q[j]]=cnt;
  }
}
}
namespace DMST{
int n,size,pre[N],id[N],vis[N],in[N];
struct EDGE{
  int u,v,cost;
  EDGE(){}
  EDGE(int a,int b,int c):u(a),v(b),cost(c){}
}E[M];
void init(int _n){n=_n,size=0;}
void add(int u,int v,int w){E[size++]=EDGE(u,v,w);}
int dmst(int root){
  int u,v,cnt,ret=0,i;
  while(1){
    for(i=0;i<n;i++)in[i]=inf;
    for(i=0;i<size;i++){
      u=E[i].u,v=E[i].v;
      if(E[i].cost<in[v]&&u!=v)pre[v]=u,in[v]=E[i].cost;
    }
    for(cnt=in[root]=i=0;i<n;i++)id[i]=vis[i]=-1;
    for(i=0;i<n;i++){
      ret+=in[i],v=i;
      while(vis[v]!=i&&id[v]==-1&&v!=root)vis[v]=i,v=pre[v];
      if(v!=root&&id[v]==-1){
        for(u=pre[v];u!=v;u=pre[u])id[u]=cnt;
        id[v]=cnt++;
      }
    }
    if(!cnt)break;
    for(i=0;i<n;i++)if(id[i]==-1)id[i]=cnt++;
    for(i=0;v=E[i].v,i<size;i++){
      E[i].u=id[E[i].u],E[i].v=id[E[i].v];
      if(E[i].u!=E[i].v)E[i].cost-=in[v];
    }
    n=cnt,root=id[root];
  }
  return ret;
}
void work(int _n){
  n=_n;
  int i,tot=1;
  for(i=0;i<m+m;i++)if(e[i].z)add(from[i],from[i^1],e[i].z),tot+=e[i].z;
  for(i=0;i<n-1;i++)add(n-1,i,tot);
  printf("%d",dmst(n-1)-tot);
}
}
int main(){
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++){
    scanf("%d%d",&x,&y);
    a[i]=P(x,y);
  }
  for(i=0;i<m;i++){
    scanf("%d%d%d%d",&x,&y,&z1,&z2);
    e[i<<1]=E(x,y,z1);
    e[i<<1|1]=E(y,x,z2);
  }
  for(i=0;i<m+m;i++)GetArea::g[e[i].x].insert(i);
  GetArea::work();
  DMST::work(cnt+2);
  return 0;
}

  

时间: 2024-11-02 23:31:04

BZOJ2960 : 跨平面的相关文章

BZOJ 2960 跨平面 对偶图+朱刘算法

题目大意:给定一张平面图,求对偶图的最小树形图 这题TM考了我两遍!!两遍!!我拿了两遍MST的60分! 世界你赢了 你逼着我学了朱刘算法233 #include <cmath> #include <vector> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 3030 #define INF 0x3f3f

高速LVDS电平简介

一.LVDS简介 1.1.LVDS信号介绍LVDS:Low Voltage Differential Signaling,低电压差分信号.LVDS传输支持速率一般在155Mbps(大约为77MHZ)以上.LVDS是一种低摆幅的差分信号技术,它使得信号能在差分PCB线对或平衡电缆上以几百Mbps的速率传输,其低压幅和低电流驱动输出实现了低噪声和低功耗.IEEE在两个标准中对LVDS信号进行了定义.ANSI/TIA/EIA-644中,推荐最大速率为655Mbps,理论极限速率为1.923Mbps.L

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

PCB设计前准备 1.准确无误的原理图.包括完整的原理图文件和网表,带有元件编码的正式的BOM.原理图中所有器件的PCB封装(对于封装库中没有的元件,硬件工程师应提供datasheet或者实物,并指定引脚的定义顺序). 2.提供PCB大致布局图或重要单元.核心电路摆放位置.安装孔位置.需要限制定位的元件.禁布区等相关信息. 设计要求 设计者必须详细阅读原理图,与项目工程师充分交流,了解电路架构,理解电路工作原理,对于关键信号的布局布线要求清楚明了. 设计流程 1.PCB文档规范 文件命名规则:采

《跨界杂谈》华为印象之混搭儿(八)美人痣与小酒窝

2015-03-02 雷震子 雷震子 雷震子 微信号 功能介绍 围绕<跨界>书的撰写 ,IT.云计算等话题聊心得 人无完人,或多或少都会有些缺陷,即使在理想化的艺术作品里也是如此,但缺陷如果恰到好处,反而会起到映衬人的整体美感的效果,比如维纳斯雕像,被称作残缺美. 美人痣与小酒窝儿 "痣"是一种皮肤疾病,属于肿瘤的一种,在非诚勿扰II里,甚至要了主人公李香山(孙红雷饰演)的命,但大部分人都不会太在意,也没啥大碍,而且这个痣在女孩脸上长的到位,大小合适,那就有一种美感,历史人

判断平面上两线段是否相交

计算几何基础——矢量和叉积 矢量 如果一条线段的端点是有次序之分的话,那么这种线段就称为 有向线段,如果有向线段p1p2的起点p1在坐标的原点,则可以把它称为矢量 p2 矢量的加减 设二维矢量 P = (x1, y1), Q = (x2, y2),则 P + Q = (x1 + x2, y1 + y2), P - Q = (x1 - x2, y1 - y2),且有 P + Q = Q + P, P - Q = -(Q - P) 矢量叉积 设矢量 P = (x1, y1), Q = (x2, y2

5.3节“开槽地平面的串扰”

这一节对参考平面不连续的情况进行讨论. 简单来说,就是原有的最小回流路径被打破,地平面完整时地平面上的回流路径如红色虚线所示. 由于信号走线层距离参考地平面的距离很短(几个mil),原有的最小回流路径和信号走线构成的面积很小(走线长度L*地参考层距离H,即L*H). 开槽之后这个路径被延伸,导致回流路径和信号走线构成的面积变大了很多(以图中来看至少为三角形面积:<走线长度L*开槽长度一半D/2>/2,即L*D/4),这里D一般为几百mil. 这样也就有了“火花大神”的结论:互感被大大加强. 结

《跨界杂谈》理解产业链

<跨界杂谈>理解产业链 精选评论 关注该公众号可参与评论 写评论 加载中 以上评论由公众帐号筛选后显示 <跨界杂谈>理解产业链 提交 我的评论 已评论 2015-04-08 雷震子 雷震子 微信号 功能介绍 <跨界杂谈>作者.对历史.人生.企业经营与发展.商业模式.心理学.IT等均感兴趣.人已奔四,事业无成,却牢骚满腹,想一吐为快,但不会像怨妇一样抱怨世事,而是希望和感兴趣的读者分享这四十年成长中的见闻与心得,希望对读者有所价值,打发下无聊时光 产业链是个非常火的名词,

My97DatePicker日历的平面显示,不是文本框点击事件后显示

二. 功能及示例 2. 特色功能 平面显示 日期控件支持平面显示功能,只要设置一下eCont属性就可以把它当作日历来使用了,无需触发条件,直接显示在页面上 示例2-1 平面显示演示 <div id="div1"></div> <script> WdatePicker({eCont:'div1',onpicked:function(dp){alert('你选择的日期是:'+dp.cal.getDateStr())}}) </script>

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

题目传送门 题目大意:给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的.$n$<=100000. $Algorithm$ 最朴素的$n^2$枚举肯定是不行了,我们在这个数量级只能考虑$nlogn$做法.那么与这个数量级比较相关的也就是分治了. 把整个平面分为两个部分,分别求出两个部分点对间最小的距离,之后再处理跨区域的情况. ? 分治法求解步骤: O(NlogN)  by hzwer1 将点集 S 分为两个?集 SL 和 SR 分别求解2 记 δ 为