题目链接:

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

题解:

1、暴力枚举:

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6.  
  7. typedef long long LL;
  8. const int maxn = 1e5 + ;
  9. const int mod = 1e9 + ;
  10.  
  11. int n, m;
  12. int a[], b[];
  13.  
  14. int main() {
  15. int T;
  16. scanf("%d", &T);
  17. while (T--) {
  18. scanf("%d%d", &n, &m);
  19. for (int i = ; i < ; i++) scanf("%d%d", a + i, b + i);
  20. LL ans = ;
  21. int x, y;
  22. for (int i = ; i <= m; i++) {
  23. scanf("%d%d", &x, &y);
  24. //一条新路线都不走
  25. int tmp = abs(x - y);
  26.  
  27. //只走一条
  28. for (int j = ; j < ; j++) {
  29. tmp = min(tmp, abs(x - a[j]) + abs(b[j] - y) + );
  30. tmp = min(tmp, abs(x - b[j]) + abs(a[j] - y) + );
  31. }
  32.  
  33. //走两条
  34. for (int j = ; j < ; j++) {
  35. for (int k = ; k < ; k++) {
  36. if (j == k) continue;
  37. //x -> j开头 -> j结尾 -> k开头 -> k结尾 -> y
  38. tmp = min(tmp, abs(x - a[j]) + abs(b[j] - a[k]) + abs(b[k] - y) + );
  39. //x -> j开头 -> j结尾 -> k结尾 -> k开头 -> y
  40. tmp = min(tmp, abs(x - a[j]) + abs(b[j] - b[k]) + abs(a[k] - y) + );
  41. //x -> j结尾 -> j开头 -> k开头 -> k结尾 -> y
  42. tmp = min(tmp, abs(x - b[j]) + abs(a[j] - a[k]) + abs(b[k] - y) + );
  43. //x -> j结尾 -> j开头 -> k结尾 -> k开头 -> y
  44. tmp = min(tmp, abs(x - b[j]) + abs(a[j] - b[k]) + abs(a[k] - y) + );
  45. }
  46. }
  47.  
  48. //走三条
  49. for (int j = ; j < ; j++) {
  50. for (int k = ; k < ; k++) {
  51. if (j == k) continue;
  52. for (int w = ; w < ; w++) {
  53. if (w == j || w == k) continue;
  54. tmp = min(tmp, abs(x - a[j]) + abs(b[j] - a[k]) + abs(b[k] - a[w]) + abs(b[w] - y) + );
  55. tmp = min(tmp, abs(x - a[j]) + abs(b[j] - a[k]) + abs(b[k] - b[w]) + abs(a[w] - y) + );
  56. tmp = min(tmp, abs(x - a[j]) + abs(b[j] - b[k]) + abs(a[k] - a[w]) + abs(b[w] - y) + );
  57. tmp = min(tmp, abs(x - a[j]) + abs(b[j] - b[k]) + abs(a[k] - b[w]) + abs(a[w] - y) + );
  58.  
  59. tmp = min(tmp, abs(x - b[j]) + abs(a[j] - a[k]) + abs(b[k] - a[w]) + abs(b[w] - y) + );
  60. tmp = min(tmp, abs(x - b[j]) + abs(a[j] - a[k]) + abs(b[k] - b[w]) + abs(a[w] - y) + );
  61. tmp = min(tmp, abs(x - b[j]) + abs(a[j] - b[k]) + abs(a[k] - a[w]) + abs(b[w] - y) + );
  62. tmp = min(tmp, abs(x - b[j]) + abs(a[j] - b[k]) + abs(a[k] - b[w]) + abs(a[w] - y) + );
  63. }
  64. }
  65. }
  66. ans += ((LL)i*tmp)%mod;
  67. ans %= mod;
  68. }
  69. printf("%lld\n", ans);
  70. }
  71. return ;
  72. }

2、floyd:

对三条新边对应的关键顶点重新建图,跑一遍floyd最短路,对于查询(xi,yi),我们枚举任意两个关键节点(aj,bj),求min(|xi-aj|+len+|bj-yi|),其中len表示新图里面aj到bj的最短距离。
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<algorithm>
  6. using namespace std;
  7. typedef long long LL;
  8.  
  9. const int maxn = 1e5 + ;
  10. const int mod = 1e9 + ;
  11. const int INF = 0x3f3f3f3f;
  12.  
  13. int n, m;
  14. int a[],mat[][];
  15.  
  16. void init() {
  17. memset(mat, 0x3f, sizeof(mat));
  18. for (int i = ; i < ; i++) mat[i][i] = ;
  19. }
  20.  
  21. int main() {
  22. int tc;
  23. scanf("%d", &tc);
  24. while (tc--) {
  25. init();
  26. scanf("%d%d", &n, &m);
  27. for (int i = ; i < ; i++) {
  28. scanf("%d%d", a + i, a + i + );
  29. }
  30. //新图
  31. for (int i = ; i < ; i++) {
  32. for (int j = ; j < ; j++) {
  33. mat[i][j] = abs(a[i] - a[j]);
  34. }
  35. }
  36. for (int i = ; i < ; i++) {
  37. mat[i][i + ] = mat[i + ][i] = ;
  38. }
  39. //floyd
  40. for (int k = ; k < ; k++) {
  41. for (int i = ; i < ; i++) {
  42. for (int j = ; j < ; j++) {
  43. mat[i][j] = min(mat[i][j], mat[i][k] + mat[k][j]);
  44. }
  45. }
  46. }
  47. LL ans = ;
  48. for (int i = ; i <= m; i++) {
  49. int x, y;
  50. scanf("%d%d", &x, &y);
  51. LL z = abs(x-y);
  52. //枚举所有情况
  53. for (int i = ; i < ; i++) {
  54. for (int j = ; j < ; j++) {
  55. int tmp = abs(x - a[i]) + mat[i][j] + abs(a[j] - y);
  56. z = min(z, (LL)tmp);
  57. }
  58. }
  59. ans += z*i;
  60. ans %= mod;
  61. }
  62. printf("%lld\n", ans);
  63. }
  64. return ;
  65. }
  

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. HTML标签速记整理W3C

    标题 <h1>段落<p>链接< href="">图像<img src="">自关闭元素,不需要结束标记换行标志& ...

  2. 前端基础-HTTP协议

    一. HTTP协议简介 二. HTTP协议之请求Request 三. HTTP协议之响应Response 四. HTTP协议完整工作流程 五. HTTP协议关键性总结 六.自定义套接字分析HTTP协议 ...

  3. 数据采集与分析的那些事——从数据埋点到AB测试

    作者:网易有数郑栋. 一.为什么企业需要一套完善的用户行为埋点和分析平台 产品初创期间,需要分析天使用户的行为来改进产品,甚至从用户行为中得到新的思路或发现来调整产品方向:产品成长过程,通过对用户行为 ...

  4. python-类(1)

    ·类(Class) 笔记: Python是一种面向对象(Object Oriented)的编程语言,类(Class)是Python的核心概念.在Python中,不管是列表.字符串.函数和类都是对象. ...

  5. Python学习 :面向对象(一)

    面向对象 一.定义 面向对象:面向对象为类和对象之间的应用 class + 类名: #在类中的函数称作 “方法“ def + 方法名(self,arg): #方法中第一个参数必须是 self prin ...

  6. BurpSuite—-Scanner模块(漏洞扫描)

    一.简介 Burp Scanner 是一个进行自动发现 web 应用程序的安全漏洞的工具.它是为渗透测试人员设计的,并且它和你现有的手动执行进行的 web 应用程序半自动渗透测试的技术方法很相似. 使 ...

  7. Hadoop学习(一)

    今天刚刚从hadoop网址下载了edition 0.21,上传到公司内网 server上试了一把. 跟着官方网站走了一趟,在执行 Format a new distributed-filesystem ...

  8. Linux下IPC机制

    Linux下IPC机制 实践要求 研究Linux下IPC机制:原理,优缺点,每种机制至少给一个示例,提交研究博客的链接 共享内存 管道 FIFO 信号 消息队列 IPC 进程间通信(IPC,Inter ...

  9. 【LG4317】花神的数论题

    [LG4317]花神的数论题 题面 洛谷 题解 设\(f_{i,up,tmp,d}\)表示当前在第\(i\)位,是否卡上界,有\(tmp\)个一,目标是几个一的方案数 最后将所有\(d\)固定,套数位 ...

  10. [WC2010]重建计划 长链剖分

    [WC2010]重建计划 LG传送门 又一道长链剖分好题. 这题写点分治的人应该比较多吧,但是我太菜了,只会长链剖分. 如果你还不会长链剖分的基本操作,可以看看我的长链剖分总结. 首先一看求平均值最大 ...