题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5636

题解:

1、暴力枚举:

#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std; typedef long long LL;
const int maxn = 1e5 + ;
const int mod = 1e9 + ; int n, m;
int a[], b[]; int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%d%d", &n, &m);
for (int i = ; i < ; i++) scanf("%d%d", a + i, b + i);
LL ans = ;
int x, y;
for (int i = ; i <= m; i++) {
scanf("%d%d", &x, &y);
//一条新路线都不走
int tmp = abs(x - y); //只走一条
for (int j = ; j < ; j++) {
tmp = min(tmp, abs(x - a[j]) + abs(b[j] - y) + );
tmp = min(tmp, abs(x - b[j]) + abs(a[j] - y) + );
} //走两条
for (int j = ; j < ; j++) {
for (int k = ; k < ; k++) {
if (j == k) continue;
//x -> j开头 -> j结尾 -> k开头 -> k结尾 -> y
tmp = min(tmp, abs(x - a[j]) + abs(b[j] - a[k]) + abs(b[k] - y) + );
//x -> j开头 -> j结尾 -> k结尾 -> k开头 -> y
tmp = min(tmp, abs(x - a[j]) + abs(b[j] - b[k]) + abs(a[k] - y) + );
//x -> j结尾 -> j开头 -> k开头 -> k结尾 -> y
tmp = min(tmp, abs(x - b[j]) + abs(a[j] - a[k]) + abs(b[k] - y) + );
//x -> j结尾 -> j开头 -> k结尾 -> k开头 -> y
tmp = min(tmp, abs(x - b[j]) + abs(a[j] - b[k]) + abs(a[k] - y) + );
}
} //走三条
for (int j = ; j < ; j++) {
for (int k = ; k < ; k++) {
if (j == k) continue;
for (int w = ; w < ; w++) {
if (w == j || w == k) continue;
tmp = min(tmp, abs(x - a[j]) + abs(b[j] - a[k]) + abs(b[k] - a[w]) + abs(b[w] - y) + );
tmp = min(tmp, abs(x - a[j]) + abs(b[j] - a[k]) + abs(b[k] - b[w]) + abs(a[w] - y) + );
tmp = min(tmp, abs(x - a[j]) + abs(b[j] - b[k]) + abs(a[k] - a[w]) + abs(b[w] - y) + );
tmp = min(tmp, abs(x - a[j]) + abs(b[j] - b[k]) + abs(a[k] - b[w]) + abs(a[w] - y) + ); tmp = min(tmp, abs(x - b[j]) + abs(a[j] - a[k]) + abs(b[k] - a[w]) + abs(b[w] - y) + );
tmp = min(tmp, abs(x - b[j]) + abs(a[j] - a[k]) + abs(b[k] - b[w]) + abs(a[w] - y) + );
tmp = min(tmp, abs(x - b[j]) + abs(a[j] - b[k]) + abs(a[k] - a[w]) + abs(b[w] - y) + );
tmp = min(tmp, abs(x - b[j]) + abs(a[j] - b[k]) + abs(a[k] - b[w]) + abs(a[w] - y) + );
}
}
}
ans += ((LL)i*tmp)%mod;
ans %= mod;
}
printf("%lld\n", ans);
}
return ;
}

2、floyd:

对三条新边对应的关键顶点重新建图,跑一遍floyd最短路,对于查询(xi,yi),我们枚举任意两个关键节点(aj,bj),求min(|xi-aj|+len+|bj-yi|),其中len表示新图里面aj到bj的最短距离。
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL; const int maxn = 1e5 + ;
const int mod = 1e9 + ;
const int INF = 0x3f3f3f3f; int n, m;
int a[],mat[][]; void init() {
memset(mat, 0x3f, sizeof(mat));
for (int i = ; i < ; i++) mat[i][i] = ;
} int main() {
int tc;
scanf("%d", &tc);
while (tc--) {
init();
scanf("%d%d", &n, &m);
for (int i = ; i < ; i++) {
scanf("%d%d", a + i, a + i + );
}
//新图
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
mat[i][j] = abs(a[i] - a[j]);
}
}
for (int i = ; i < ; i++) {
mat[i][i + ] = mat[i + ][i] = ;
}
//floyd
for (int k = ; k < ; k++) {
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
mat[i][j] = min(mat[i][j], mat[i][k] + mat[k][j]);
}
}
}
LL ans = ;
for (int i = ; i <= m; i++) {
int x, y;
scanf("%d%d", &x, &y);
LL z = abs(x-y);
//枚举所有情况
for (int i = ; i < ; i++) {
for (int j = ; j < ; j++) {
int tmp = abs(x - a[i]) + mat[i][j] + abs(a[j] - y);
z = min(z, (LL)tmp);
}
}
ans += z*i;
ans %= mod;
}
printf("%lld\n", ans);
}
return ;
}
  

HDU 5636 Shortest Path的更多相关文章

  1. HDU 5636 Shortest Path 暴力

    Shortest Path 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5636 Description There is a path graph ...

  2. HDU 5636 Shortest Path(Floyed,枚举)

    Shortest Path Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tot ...

  3. HDU 5636 Shortest Path 分治+搜索剪枝

    题意:bc round 74 分析(官方题解): 你可以选择分类讨论, 但是估计可能会写漏一些地方. 只要抽出新增边的端点作为关键点, 建立一个新图, 然后跑一遍floyd就好了. 复杂度大概O(6^ ...

  4. HDU 5636 Shortest Path(Floyd)

    题目链接  HDU5636 n个点,其中编号相邻的两个点之间都有一条长度为1的边,然后除此之外还有3条长度为1的边. m个询问,每次询问求两个点之前的最短路. 我们把这三条边的6个点两两算最短路, 然 ...

  5. hdu 3631 Shortest Path(Floyd)

    题目链接:pid=3631" style="font-size:18px">http://acm.hdu.edu.cn/showproblem.php?pid=36 ...

  6. HDU - 3631 Shortest Path(Floyd最短路)

    Shortest Path Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u SubmitStat ...

  7. HDU - 4725_The Shortest Path in Nya Graph

    The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...

  8. hdu 3631 Shortest Path

    floyd算法好像很奇妙的样子.可以做到每次加入一个点再以这个点为中间点去更新最短路,效率是n*n. #include<cstdio> #include<cstring> #i ...

  9. HDU 4479 Shortest path 带限制最短路

    题意:给定一个图,求从1到N的递增边权的最短路. 解法:类似于bellman-ford思想,将所有的边先按照权值排一个序,然后依次将边加入进去更新,每条边只更新一次,为了保证得到的路径是边权递增的,每 ...

随机推荐

  1. hive的分桶

    套话之分桶的定义: 分桶表是对列值取哈希值的方式,将不同数据放到不同文件中存储.对于 hive 中每一个表.分区都可以进一步进行分桶. 列的哈希值除以桶的个数来决定每条数据划分在哪个桶中.(网上其它定 ...

  2. 搭建iSCSI共享IPSAN

    iSCSI(internet SCSI)是一个供硬件设备使用的.可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择. ...

  3. 【深度优先搜索】MZOJ_1344工作依赖

    这道题的读入非常毒瘤...恶心到我了 我痛苦地弄了很久,还是被卡住了我还真是▇了狗了.[传送门](特此声明:学校内部OJ,需登录) 题目描述(Description): 2008年,奥运会将在中国举行 ...

  4. Makefile:如何写目标依赖

    本文并不是Makefile的教程,仅是本人学习时的感悟. Makefile的基本格式 目标:依赖文件(or 目标) [tab]命令 目标: 是要生成的或操作的命令的索引 依赖: 是生成目标依赖的文件或 ...

  5. IDEA-Debug调试操作

    基本概念 快捷键和eclipse还是有区别的,不过基本概念是相通的   Step into F7 单步调试进入函数内部.  Step over F8 单步调试不进入函数内部,如果装了金山词霸2006则 ...

  6. 20155334 实验四:Android程序设计

    20155334实验四:Android程序设计 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android组件.布局管理器的使用: 掌握Android中事件 ...

  7. C# JSON和对象之间互相转换

    1.首先是声明用户信息对象,DataContract修饰类,表示可以被解析成JSON,DataMember修饰属性,Order表示 解析的顺序,另外Lover是数组列表,表示女朋友个数 Address ...

  8. 【转载】Ogre3d 2.1 源码编译安装教程

    原文:Ogre3d 2.1 源码编译安装教程 今年是3D手游年,今年也是游戏引擎战争进入白热的一年. 移动游戏的红海时代,让各大端游也忍不住纷纷伸出大白腿,Unreal.CryEngine纷纷宣布自己 ...

  9. Drupal7重置密码方法

    Drupal版本 7.40 方法1: 根目录index.php添加 require_once 'includes/password.inc'; require_once 'includes/boots ...

  10. dotnet core 开发中遇到的问题

    1.发布的时候把视图cshtml文件也编译为dll了,如何控制不编译视图? 编辑功能文件(xx.csproj),加入一个选项: <PropertyGroup> <TargetFram ...