Shortest Path

 Accepts: 40
 Submissions: 610
 Time Limit: 4000/2000 MS (Java/Others)
 Memory Limit: 131072/131072 K (Java/Others)
问题描述
有一条长度为nn的链. 节点ii和i+1i+1之间有长度为11的边. 现在又新加了3条边, 每条边长度都是1. 给出mm个询问, 每次询问两点之间的最短路.
输入描述
输入包含多组数据. 第一行有一个整数TT, 表示测试数据的组数. 对于每组数据:

第一行包含2个整数nn和mm (1 \le n,m \le 10^5)(1≤n,m≤10​5​​)表示节点的数目和询问数目. 接下来一行包含66个有空格分开的整数a_1, b_1, a_2, b_2, a_3, b_3a​1​​,b​1​​,a​2​​,b​2​​,a​3​​,b​3​​ (1 \le a_1,a_2,a_3,b_1,b_2,b_3 \le n)(1≤a​1​​,a​2​​,a​3​​,b​1​​,b​2​​,b​3​​≤n), 表示新加的三条边为(a_1,b_1)(a​1​​,b​1​​), (a_2,b_2)(a​2​​,b​2​​), (a_3,b_3)(a​3​​,b​3​​). 接下来mm行, 每行包含两个整数s_is​i​​和t_it​i​​ (1 \le s_i, t_i \le n)(1≤s​i​​,t​i​​≤n), 表示一组询问.

所有数据中mm的和不超过10^610​6​​.
输出描述
对于每组数据, 输出一个整数S=(\displaystyle\sum_{i=1}^{m} i \cdot z_i) \text{ mod } (10^9 + 7)S=(​i=1​∑​m​​i⋅z​i​​) mod (10​9​​+7), 其中z_iz​i​​表示第ii组询问的答案.
输入样例
1
10 2
2 4 5 7 8 10
1 5
3 1
输出样例
7
思路:因为在每加入这些边之前我们知道任意两点最短距离是abs(a-b);
那么我们每次要询问两个点之间的最短路,所以我们可以把新加的边和询问的边中两个点拿出来离散化下
然后建图加边,然后直接最短路即可,复杂度为O(m*8*8)。
  1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<stdlib.h>
5 #include<string.h>
6 #include<map>
7 using namespace std;
8 typedef long long LL;
9 int flag[10];
10 const LL N=1e9+7;
11 int cmp(const void*p,const void*q);
12 typedef struct pp
13 {
14 LL x;
15 int id;
16 }ss;
17 ss aa[10];
18 LL d[10];LL ma[10][10];
19 LL num[10];LL bum[10];
20 void dij(int n,int ans);
21 int main(void)
22 {
23 LL i,j,k,p,q;
24 scanf("%lld",&k);
25 while(k--)
26 {
27 scanf("%lld %lld",&p,&q);
28 for(i=0;i<6;i++)
29 {
30 scanf("%lld",&num[i]);
31 }LL sum=0;LL a=0;
32 while(q--)
33 { a++;
34 scanf("%lld %lld",&num[6],&num[7]);
35 LL ans=1;
36 for(i=0;i<8;i++)
37 {
38 aa[i].x=num[i];
39 aa[i].id=i;
40 }qsort(aa,8,sizeof(ss),cmp);
41 bum[aa[0].id]=1;
42 for(i=1;i<8;i++)
43 {
44 if(aa[i].x!=aa[i-1].x)
45 ans++;
46 bum[aa[i].id]=ans;
47 }
48 for(i=0;i<10;i++)
49 {
50 for(j=0;j<10;j++)
51 {
52 ma[i][j]=N;
53 }
54 }
55 ma[bum[0]][bum[1]]=ma[bum[1]][bum[0]]=1;
56 ma[bum[2]][bum[3]]=ma[bum[3]][bum[2]]=1;
57 ma[bum[4]][bum[5]]=ma[bum[5]][bum[4]]=1;
58 for(i=0;i<8;i++)
59 {
60 for(j=0;j<8;j++)
61 {
62 LL x=bum[i];
63 LL y=bum[j];
64 ma[x][y]=min(ma[x][y],abs(num[i]-num[j]));
65 }
66 }
67 dij(bum[6],ans);sum=(sum%N+d[bum[7]]*a%N)%N;
68 }printf("%lld\n",sum);
69 }return 0;
70 }
71
72 void dij(int n,int ans)
73 {
74 fill(d,d+10,N);
75 memset(flag,0,sizeof(flag));
76 d[n]=0;int i,j;
77 while(true)
78 {
79 int l=-1;
80 for(i=1;i<=ans;i++)
81 {
82 if((l==-1||d[l]>d[i])&&!flag[i])
83 {
84 l=i;
85 }
86 }if(l==-1)
87 break;
88 flag[l]=1;
89 for(i=1;i<=ans;i++)
90 {
91 d[i]=min(ma[l][i]+d[l],d[i]);
92 }
93 }
94 }
95 int cmp(const void*p,const void*q)
96 {
97 ss*n=(ss*)p;
98 ss*m=(ss*)q;
99 return n->x>m->x?1:-1;
100 }
 

Shortest Path(hdu5636)的更多相关文章

  1. hdu 3631 Shortest Path(Floyd)

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

  2. HDU 5636 Shortest Path(Floyd)

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

  3. HDU-3631 Shortest Path (floyd)

    Description When YY was a boy and LMY was a girl, they trained for NOI (National Olympiad in Informa ...

  4. Leetcode 943. Find the Shortest Superstring(DP)

    题目来源:https://leetcode.com/problems/find-the-shortest-superstring/description/ 标记难度:Hard 提交次数:3/4 代码效 ...

  5. Java Learning Path(四) 方法篇

    Java Learning Path(四) 方法篇 Java作为一门编程语言,最好的学习方法就是写代码.当你学习一个类以后,你就可以自己写个简单的例子程序来运行一下,看看有什么结果,然后再多调用几个类 ...

  6. Java Learning Path(五)资源篇

    Java Learning Path(五)资源篇 1. http://java.sun.com/ (英文) Sun的Java网站,是一个应该经常去看的地方.不用多说. 2.http://www-900 ...

  7. Java Learning Path(三)过程篇

    Java Learning Path(三)过程篇 每个人的学习方法是不同的,一个人的方法不见得适合另一个人,我只能是谈自己的学习方法.因为我学习Java是完全自学的,从来没有问过别人,所以学习的过程基 ...

  8. ZOJ 2760 How Many Shortest Path(最短路径+最大流)

    Description Given a weighted directed graph, we define the shortest path as the path who has the sma ...

  9. 74(2B)Shortest Path (hdu 5636) (Floyd)

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

随机推荐

  1. (转载)Java生成和操作Excel文件

    JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...

  2. 前后端分离进阶一:使用ElementUI+前端分页

    前两篇入门:前后端分离初体验一:前端环境搭建 前后端分离初体验二:后端环境搭建+数据交互 参考:https://www.bilibili.com/video/BV137411B7vB B站UP:楠哥教 ...

  3. 11 — springboot集成swagger — 更新完毕

    1.前言 理论知识滤过,自行百度百科swagger是什么 2.导入依赖 <!-- swagger所需要的依赖--> <dependency> <groupId>io ...

  4. 第三个基础框架 — springMVC — 更新完毕

    1.什么是springMVC? 还是老规矩,百度百科一下 这里面说了一堆废话,去官网瞄一下 官网网址:https://docs.spring.io/spring-framework/docs/curr ...

  5. 面对大规模 K8s 集群,这款诊断利器必须要“粉一波”!

    作者|段超 来源|尔达 Erda 公众号 背景 我们是一家做商业软件的公司,从一开始我们就把软件交付流程做的非常标准且简单,所有的软件都是基于我们的企业数字化平台 Erda(现已开源)来交付,底层基于 ...

  6. 大数据学习day15----第三阶段----scala03--------1.函数(“_”的使用, 函数和方法的区别)2. 数组和集合常用的方法(迭代器,并行集合) 3. 深度理解函数 4 练习(用java实现类似Scala函数式编程的功能(不能使用Lambda表达式))

    1. 函数 函数就是一个非常灵活的运算逻辑,可以灵活的将函数传入方法中,前提是方法中接收的是类型一致的函数类型 函数式编程的好处:想要做什么就调用相应的方法(fliter.map.groupBy.so ...

  7. ABA 问题

    CAS 导致 ABA 问题CAS 算法实现了一个重要的前提,需要取出内存中某时刻的数据,并在当下时刻比较并替换,那么这个时间差会导致数据的变化. 比如说一个线程 one 从内存位置 V 中取出A,这时 ...

  8. Linux定时任务crontable简介

    Linux下定时执行任务的方法:Linux之crond 服务介绍:https://www.cnblogs.com/liang-io/p/9596294.html http://www.mamicode ...

  9. Linux学习 - 脚本安装包

    脚本安装包不是独立的软件包类型,常见安装的是源码包

  10. Shell脚本实现监视指定进程的运行状态

    在之前的博客中,曾经写了自动化测试程序的实现方法,现在开发者需要知道被测试的进程(在此指运行在LINUX上的主进程的)在异常退出之前的进程的运行状态,例如内存的使用率.CPU的使用率等. 现用shel ...