BZOJ4061/Gym100624F CERC2012 Farm and Factory 最短路、切比雪夫距离
设\(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 最短路、切比雪夫距离的更多相关文章
- 【BZOJ4061】[Cerc2012]Farm and factory(最短路,构造)
[BZOJ4061][Cerc2012]Farm and factory(最短路,构造) 题面 BZOJ 然而权限题QwQ. 题解 先求出所有点到达\(1,2\)的最短路,不妨记为\(d_{u,1}, ...
- [BZOJ4061][Cerc2012]Farm and factory
bzoj 鉴于是权限题,放一下题面. Description 向Byteland的国王Bitolomew致敬!国王Bitolomew认为Byteland是一个独一无二的国家.它太小了,它所有的市民(包 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 题解-bzoj4061 CERC-2012Farm and Factory
Problem Please contact lydsy2012@163.com! 题意概要:给定\(n\)点\(m\)边无向图,设定两个起点为\(1,2\),现要求在图中增加一个点,并将这个点与其他 ...
- sgu 185 最短路建网络流
题目:给出一个图,从图中找出两条最短路,使得边不重复. 分析:既然是最短路,那么,两条路径上的所有节点的入边(s,x).出边(x,e)必定是最优的,即 dis[x] = dis[s]+edge_dis ...
- poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)
http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Subm ...
- Cogs 309. [USACO 3.2] 香甜的黄油 dijkstra,堆,最短路,floyd
题目:http://cojs.tk/cogs/problem/problem.php?pid=309 309. [USACO 3.2] 香甜的黄油 ★★ 输入文件:butter.in 输出文件 ...
- 多源最短路Floyd 算法————matlab实现
弗洛伊德(Floyd)算法是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名. 基本思想 通过Floyd计 ...
- 单源最短路Dijkstra算法——matlab实现
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...
随机推荐
- 浅谈Android 混淆和加固
混淆: 针对项目代码,代码混淆通常将代码中的各种元素(变量.函数.类名等)改为无意义的名字,使得阅读的人无法通过名称猜测其用途,增大反编译者的理解难度. 虽然代码混淆可以提高反编译的门槛,但是对开发者 ...
- 自定义View类
一.如何创建自定义的View类 ①.创建一个继承android.view.View类的Java类,并且重写构造方法(至少需要重写一个构造方法) ②.根据需要重写其他方法 ③.在项目的活动中,创建并实例 ...
- LeetCode题解之Squares of a Sorted Array
1.题目描述 2.问题分析 使用过两个计数器. 3.代码 class Solution { public: vector<int> sortedSquares(vector<int& ...
- sql server 通用修改表数据存储过程
ALTER PROC [dbo].[UpdateTableData] ), ), ), ), ) AS BEGIN ) SET @sql ='UPDATE '+@TableName; --获取SqlS ...
- kafka_2.11-2.0.0_常用操作
参考博文:Kafka消费组(consumer group) 参考博文:kafka 1.0 中文文档(九):操作 参考博文:kafka集群管理工具kafka-manager部署安装 以下操作可以在min ...
- LeetCode算法题-Number of Boomerangs(Java实现)
这是悦乐书的第231次更新,第244篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第98题(顺位题号是447).给定平面中的n个点都是成对不同的,"回旋镖&qu ...
- JavaScript中的Generator函数
1. 简介 Generator函数时ES6提供的一种异步编程解决方案.Generator语法行为和普通函数完全不同,我们可以把Generator理解为一个包含了多个内部状态的状态机. 执行Genera ...
- JavaScript闭包理解【关键字:普通函数、变量访问作用域、闭包、解决获取元素标签索引】
一.闭包(Closure)模糊概述 之前总觉得闭包(Closure)很抽象而且难理解,百度一下"闭包"名词,百度的解释是:“闭包是指可以包含自由(未绑定到特定对象)变量的代 ...
- Spark1.0.0 源码编译和部署包生成
问题导读:1.如何对Spark1.0.0源码编译?2.如何生成Spark1.0的部署包?3.如何获取包资源? Spark1.0.0的源码编译和部署包生成,其本质只有两种:Maven和SBT,只不过针对 ...
- 【CQOI2014】危桥
[CQOI2014]危桥 Description Alice和Bob居住在一个由N个岛屿组成的国家,岛屿被编号为\(0\)到\(N-1\).某些岛屿之间有桥相连,桥上的道路都是双向的,但是一次只能供一 ...