传送门


设\(f_i\)表示\(i\)到\(1\)号点的最短距离,\(g_i\)表示\(i\)到\(2\)号点的最短距离,\(s_i\)表示\(n+1\)号点到\(i\)号点的最短距离,\(A=s_1,B=s_2\)

根据最短路三角形不等式,\(|f_i - A| \leq s_i \leq f_i + A , |g_i - B| \leq s_i \leq g_i + B\)

而\(s_i\)要取到最小值,所以\(s_i = \max\{|f_i - A| , |g_i - B|\}\)

所以我们要求的是\(\sum\limits_{i=1}^N \max\{|f_i - A| , |g_i - B|\}\),这相当于求一个动点\((A,B)\)到平面上\(N\)个点\((f_i,g_i)\)的最小切比雪夫距离和。

切比雪夫距离可以转为曼哈顿距离,将坐标\((x,y)\)变为\((\frac{x+y}{2} , \frac{x-y}{2})\),前者的切比雪夫距离等效于后者的曼哈顿距离。而曼哈顿距离可以直接拆开横纵坐标然后取中位数。

注意:我天真的以为2012年的题不会卡SPFA……

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<cstring>
#include<iomanip>
#include<queue>
#define INF 0x3f3f3f3f
//This code is written by Itst
using namespace std; inline int read(){
int a = 0;
char c = getchar();
while(!isdigit(c) && c != EOF)
c = getchar();
while(isdigit(c)){
a = a * 10 + c - 48;
c = getchar();
}
return a;
} #define PLI pair < long long , int >
#define st first
#define nd second
const int MAXN = 1e5 + 7;
struct Edge{
int end , upEd , w;
}Ed[MAXN * 6];
int head[MAXN] , N , M , cntEd;
long long dis[2][MAXN];
priority_queue < PLI > q; inline void addEd(int a , int b , int w){
Ed[++cntEd].end = b;
Ed[cntEd].w = w;
Ed[cntEd].upEd = head[a];
head[a] = cntEd;
} void SPFA(int ind){
memset(dis[ind] , 0x3f , sizeof(long long) * (N + 1));
dis[ind][ind + 1] = 0;
q.push(PLI(0 , ind + 1));
while(!q.empty()){
PLI t = q.top();
q.pop();
if(-t.st != dis[ind][t.nd]) continue;
for(int i = head[t.nd] ; i ; i = Ed[i].upEd)
if(dis[ind][Ed[i].end] > dis[ind][t.nd] + Ed[i].w){
dis[ind][Ed[i].end] = dis[ind][t.nd] + Ed[i].w;
q.push(PLI(-dis[ind][Ed[i].end] , Ed[i].end));
}
}
} inline long long abss(long long x){return x < 0 ? -x : x;} void out(long long a , int b){
cout << a / b << '.';
a %= b;
for(int i = 1 ; i <= 8 ; ++i){
a *= 10;
cout << a / b;
a %= b;
}
putchar('\n');
} int main(){
vector < long long > x , y;
for(int T = read() ; T ; --T){
N = read(); M = read();
memset(head , 0 , sizeof(int) * (N + 1));
cntEd = 0;
for(int i = 1 ; i <= M ; ++i){
int a = read() , b = read() , c = read();
addEd(a , b , c); addEd(b , a , c);
}
SPFA(0); SPFA(1);
x.clear(); y.clear();
long long sum = 0;
for(int i = 1 ; i <= N ; ++i){
x.push_back(dis[0][i] - dis[1][i]);
y.push_back(dis[0][i] + dis[1][i]);
}
sort(x.begin() , x.end()); sort(y.begin() , y.end());
long long mid = x[N >> 1];
for(int i = 0 ; i < N ; ++i)
sum += abss(x[i] - mid);
mid = y[N >> 1];
for(int i = 0 ; i < N ; ++i)
sum += abss(y[i] - mid);
out(sum , 2 * N);
cerr << N << ' ' << sum << endl;
}
return 0;
}

BZOJ4061/Gym100624F CERC2012 Farm and Factory 最短路、切比雪夫距离的更多相关文章

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

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

  2. [BZOJ4061][Cerc2012]Farm and factory

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

  3. bzoj AC倒序

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

  4. 题解-bzoj4061 CERC-2012Farm and Factory

    Problem Please contact lydsy2012@163.com! 题意概要:给定\(n\)点\(m\)边无向图,设定两个起点为\(1,2\),现要求在图中增加一个点,并将这个点与其他 ...

  5. sgu 185 最短路建网络流

    题目:给出一个图,从图中找出两条最短路,使得边不重复. 分析:既然是最短路,那么,两条路径上的所有节点的入边(s,x).出边(x,e)必定是最优的,即 dis[x] = dis[s]+edge_dis ...

  6. poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)

    http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Subm ...

  7. Cogs 309. [USACO 3.2] 香甜的黄油 dijkstra,堆,最短路,floyd

    题目:http://cojs.tk/cogs/problem/problem.php?pid=309 309. [USACO 3.2] 香甜的黄油 ★★   输入文件:butter.in   输出文件 ...

  8. 多源最短路Floyd 算法————matlab实现

    弗洛伊德(Floyd)算法是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名. 基本思想 通过Floyd计 ...

  9. 单源最短路Dijkstra算法——matlab实现

    迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...

随机推荐

  1. LEDAPS1.3.0版本移植到windows平台----HuCal定标模块

    这个是2012年左右放在百度空间的,谁知百度空间关闭...转移到博客园. 最近项目用到3.1.2版本的LEDAPS,新版本的使用情况会在后续文章中慢慢丰富. HuCal是将LEDAPS项目中的TM/E ...

  2. JAVA 利用MyEclipse结合TestNG测试框架进行单元测试

    利用MyEclipse结合TestNG测试框架进行单元测试   by:授客 QQ:1033553122 测试环境 jdk1.8.0_121 myeclipse-10.0-offline-install ...

  3. 计算机网络TCP“三次握手”

    终于有时间写这篇文章了,最近真的比较忙! TCP协议  之 “三次握手” 引言:我们知道,TCP是面向连接的协议(相较于UDP无连接的协议),会在传送数据之前先在 发送端 & 接收端 之间建立 ...

  4. git 入门教程之版本管理

    版本管理 背景 在上一节中我们已经成功创建版本库并且已经添加test.txt等文件,这一节我们继续讲解如何进行版本控制. 首先我们先查看test.txt 文件有什么内容吧! # 查看文件内容 $ ca ...

  5. html常用标签学习笔记

    本文内容: 前言:本文讲述的内容包括几类常用标签,以及这些标签的一些常用属性(有一些属性由于已经有CSS样式来代替,所以对于一些不重要的这里选择不讲) 排版标签 段落标签:p div span 标题标 ...

  6. 记一次zookeeper单机伪集群分布

    zookeeper的各版本(历史版本)下载地址:http://apache.org/dist/zookeeper/ 环境>:linux 下载的zookeeper解压成3个

  7. shell编程-输出(六)

    echo输出echo指令用于字符串的输出 格式:echo 字符串 直接输出字符串:string echo 'this is string-output' 用双引号,这儿也可以省略引号 转义字符:\ e ...

  8. mssql sqlserver 可以存储二进制数据的字段类型详解

    转自: http://www.maomao365.com/?p=6738 摘要: 下文将从数据库的数据类型着手,剖析在sqlserver数据库中可以存储二进制数据的数据类型,如下所示: mssql s ...

  9. AOP的底层实现:JDK动态代理与Cglib动态代理

    转载自 https://www.cnblogs.com/ltfxy/p/9872870.html SpringAOP底层的实现原理: JDK动态代理:只能对实现了接口的类产生代理.(实现接口默认JDK ...

  10. 【Linux基础】VI命令模式下删除拷贝与粘贴

    在VI命令模式下:y 表示拷贝, d 表示删除,p标识粘贴 1.删除 dw 表示删除从当前光标到光标所在单词结尾的内容. d0 表示删除从当前光标到光标所在行首的内容. d$ 表示删除从当前光标到光标 ...