Problem

Please contact lydsy2012@163.com!

题意概要:给定\(n\)点\(m\)边无向图,设定两个起点为\(1,2\),现要求在图中增加一个点,并将这个点与其他\(n\)个点每个点连一条边(共\(n\)条),要求连完边后在新的图中从原来\(n\)个点到任一起点的最短路不一定经过新点,最小化连的\(n\)条边的权值和

Solution

超好玩的一道题

设\(a_i,b_i\)分别表示从\(1,2\)出发到达\(i\)节点的最短路,设新增节点为\(t\),\(d_i\)表示从\(t\)到\(i\)所连的边

发现由于最短路不能经过\(t\),所以

\(d_1+d_i\geq a_i\\d_2+d_i\geq b_i\)

即\(d_i\geq \max(a_i-d_1,b_i-d_2)\)

假定已经确定了\(d_i\),希望\(d_1\)最小,发现若\(d_1> a_i+d_i\)和\(d_1=a_i+d_i\)是等价的,因为即便\(d_1\)再大,在考虑后面的点时\(a_i+d_i\)会代替\(d_1\)来计算后面的限制,所以有\(d_1\leq a_i+d_i\),同理可得

\(d_1\leq a_i+d_i\\d_2\leq b_i+d_i\)

综上,可得

\(d_i\geq \max(a_i-d_1,d_1-a_i,b_i-d_2,d_2-b_i)=\max(|a_i-d_1|,|b_i-d_2|)\)

然后要最小化\(\sum d_i\),假定已经确定\(d_1,d_2\),则每个\(d_i\)一定取不等式的等号时最优,即要求最小化的式子为\(\sum \max(|a_i-d_1|,|b_i-d_2|)\)

现在只需要确定\(d_1,d_2\)了。将这个东西放在二维平面上,即有\(n\)个点\((a_i,b_i)\),发现上面的式子就是\((d_1,d_2)\)关于\(n\)个点的切比雪夫距离

问题转化为确定一个点\((d_1,d_2)\)使得这个点到\(n\)个点的切比雪夫距离和最小。这是个经典问题,可以将坐标轴旋转\(45°\)将切比雪夫距离转化为曼哈顿距离

最小化一个点到\(n\)个点的曼哈顿距离之和可以将横纵坐标拆开分别取最小,即横坐标取\(n\)个点横坐标的中位数,纵坐标取\(n\)个点纵坐标的中位数

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; inline void read(int&x){
char c11=getchar();x=0;while(!isdigit(c11))c11=getchar();
while(isdigit(c11))x=x*10+c11-'0',c11=getchar();
} const int N=101000,M=301000;
const ll inf = 0x3f3f3f3f3f3f3f3f;
struct Edge{int v,nxt,w;}a[M+M];
ll A[N],B[N];int head[N];
int n,m,_; namespace SpFa{
int top;
struct node{
int x;ll v;
inline node(){}
inline node(const int&X,const ll&V):x(X),v(V){}
}h[M];
inline void push(node nw){
h[++top]=nw;
int pp=top;
while(pp>1&&h[pp].v<h[pp>>1].v)
swap(h[pp],h[pp>>1]),pp>>=1;
}
inline void pop(){
int pp=1;
h[1]=h[top--];
while(((pp<<1)<=top&&h[pp].v>h[pp<<1].v)||((pp<<1|1)<=top&&h[pp].v>h[pp<<1|1].v)){
pp<<=1;
if(h[pp].v>h[pp|1].v)pp|=1;
swap(h[pp],h[pp>>1]);
}
} void main(int s,ll*dis){
for(int i=1;i<=n;++i)dis[i]=inf;
h[top=1]=node(s,0ll),dis[s]=0;
node nw;
while(top){
nw=h[1];pop();
for(int i=head[nw.x];i;i=a[i].nxt)
if(dis[a[i].v]>dis[nw.x]+a[i].w){
dis[a[i].v]=dis[nw.x]+a[i].w;
push(node(a[i].v,dis[a[i].v]));
}
}
}
} void init(){
read(n),read(m),_=0;
for(int i=n;i;--i)head[i]=0;
for(int i=1,u,v,w;i<=m;++i){
read(u),read(v),read(w);
a[++_].v=v,a[_].w=w,a[_].nxt=head[u],head[u]=_;
a[++_].v=u,a[_].w=w,a[_].nxt=head[v],head[v]=_;
}
} void work(){
ll x,y,Ans=0ll;
for(int i=n;i;--i)
x=A[i],y=B[i],A[i]=x+y,B[i]=x-y;
sort(A+1,A+n+1);sort(B+1,B+n+1);
x=A[n+1>>1],y=B[n+1>>1];
for(int i=n;i;--i)
Ans+=abs(A[i]-x)+abs(B[i]-y);
printf("%.9lf\n",0.5*Ans/n);
} int main(){
int T;read(T);
while(T--){
init();
SpFa::main(1,A);
SpFa::main(2,B);
work();
}return 0;
}

题解-bzoj4061 CERC-2012Farm and Factory的更多相关文章

  1. [BZOJ4061][Cerc2012]Farm and factory

    bzoj 鉴于是权限题,放一下题面. Description 向Byteland的国王Bitolomew致敬!国王Bitolomew认为Byteland是一个独一无二的国家.它太小了,它所有的市民(包 ...

  2. 【BZOJ4061】[Cerc2012]Farm and factory(最短路,构造)

    [BZOJ4061][Cerc2012]Farm and factory(最短路,构造) 题面 BZOJ 然而权限题QwQ. 题解 先求出所有点到达\(1,2\)的最短路,不妨记为\(d_{u,1}, ...

  3. POJ3436 ACM Computer Factory(最大流/Dinic)题解

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8944   Accepted: 3 ...

  4. 「POJ3436」ACM Computer Factory题解

    题意: 有很多台机器,可以把物件从一种状态改装成另一种状态,初始全为\(0\),最终状态全为\(1\),让你可以拼凑机器,请问最大总性能为多少,且要求输出方案. 题解: 这道题是真的水啊,我不想写太多 ...

  5. BZOJ4061/Gym100624F CERC2012 Farm and Factory 最短路、切比雪夫距离

    传送门--BZOJCH 传送门--Vjudge 设\(f_i\)表示\(i\)到\(1\)号点的最短距离,\(g_i\)表示\(i\)到\(2\)号点的最短距离,\(s_i\)表示\(n+1\)号点到 ...

  6. Gym - 101480 CERC 15:部分题目题解(队内第N次训练)

    -------------------题目难度较难,但挺有营养的.慢慢补. A .ASCII Addition pro:用一定的形式表示1到9,让你计算加法. sol:模拟. solved by fz ...

  7. HDU 5536 Chip Factory 字典树

    Chip Factory Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid= ...

  8. BZOJ1680: [Usaco2005 Mar]Yogurt factory

    1680: [Usaco2005 Mar]Yogurt factory Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 106  Solved: 74[Su ...

  9. POJ3436 ACM Computer Factory 【最大流】

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5412   Accepted: 1 ...

随机推荐

  1. Java工具之上传文件

    4个代码 1.前端JSP 2.自定义异常类 3.文件上传抽象类 4.Servlet 1.JSP <%@ page contentType="text/html;charset=UTF- ...

  2. Java基础之IO流学习总结

    Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  3. Linux记录-salt命令

    salt '*id*'  test.ping salt -N  组名  cmd.run '' salt -G "ipv4:0.0.0.0"  cmd.run '' salt '*i ...

  4. ruby select 方法,可用于先查询结果后,再次用条件限制

    1. 用于条件过滤 @works=DworkPro.all.order(:work_type) @work_pro=@works.select{ |x| x.job_type == 7} 2. sel ...

  5. 当一些库和类无法在Silverlight工程中使用

    因为要更新空间数据,所以需要导入MDB文件.但是Silverlight中不能直接使用OdbcConnection类读取MDB文件,所以需要新建一个ASP.NET空Web应用程序 工程 随后在此工程中, ...

  6. C JAVA你可能不知道的那些编程细节

    关于printf的格式化字符 %* *与其它占位符结合使用, *将首先被一个 int 变量值代替后再被格式化. 如 printf("%.*s.", 2, "Hello&q ...

  7. linux centos 7 nodejs 的安装

    先SSH 进到终端 随便一目录,或者/temp下 下载nodejs: (如果下载不了,官网 https://nodejs.org/en/download/复制LINUX版本的链接过来) wget ht ...

  8. nginx接入let's encrypt

    按以下步骤: 一.放开443端口 我的是云服务器,默认没开放443端口,需要先在控制台放开 二.使用let’s encrypt 生成证书 执行以下命令: git clone https://githu ...

  9. 简单回射程序之处理accept返回EINTR错误的服务器程序版本

    #include <stdio.h> #include <stdlib.h> #include <time.h> #include <errno.h> ...

  10. mini2440串口使用

    1.安装驱动CH340-USB转串口驱动,安装完成最好重启一下电脑. 2.用串口线将开发板与pc项链,并打开电源,通过电脑设备管理器查看端口(下一步要用到). 3.运行SecureCRT.exe,并建 ...