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. php背景透明png

    php背景透明png php处理图片时,例如生成水印,对于png的水印经常背景会加有色的背景,用此方法可以去除背景 主要函数:imagecolortransparent: //添加水印 $src = ...

  2. 5.Maximum Product Subarray-Leetcode

    f(j+1)为以下标j结尾的连续子序列最大乘积值(1) 状态转移方程如何表示呢: 这里我们知道A[j]可能为正数(或0)或负数,那么当A[j]为正数,期望前j个乘积为正数,若为负数,则期望前面的为负数 ...

  3. ARM汇编基础指令

    Cortex-A7 常用汇编指令 一.处理器内部数据传输指令 1.mov 将数据从一个寄存器拷贝到另外一个寄存器,或者将一个立即数传递到寄存器里面 MOV R0,R1 @将寄存器 R1 中的数据传递给 ...

  4. HDFS03 HDFS的API操作

    HDFS的API操作 目录 HDFS的API操作 客户端环境准备 1.下载windows支持的hadoop 2.配置环境变量 3 在IDEA中创建一个Maven工程 HDFS的API实例 用客户端远程 ...

  5. Vue函数防抖和函数节流

    函数防抖(debounce) 应用场景 登录.发短信等按钮避免用户点击太快,以致于发送了多次请求,需要防抖 调整浏览器窗口大小时,resize 次数过于频繁,造成计算过多,此时需要一次到位,就用到了防 ...

  6. Scala(六)【模式匹配】

    目录 一.基本语法 二.匹配固定值 三.守卫 四.匹配类型 五.匹配集合 1.Array 2.List 3.元祖 4.对象和样例类 六.偏函数 七.赋值匹配 八.for循环匹配 一.基本语法 在匹配某 ...

  7. STM32代码常见的坑

    1 混淆换行符\和除号/造成的坑 入坑代码: GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin ...

  8. jenkins之代码部署回滚脚本

    #!/bin/bash DATE=`date +%Y-%m-%d_%H-%M-%S` METHOD=$1 BRANCH=$2 GROUP_LIST=$3 function IP_list(){ if ...

  9. ORACLE 加大日志文件

    --新建临时日志文件alter database add logfile group 4 ('/u01/app/oracle/oradata/orcl/redo04.log') size 10m;al ...

  10. swift设置导航栏item颜色和状态栏颜色

    //swift设置导航栏item颜色和状态栏颜色 let dict:Dictionary =[NSForegroundColorAttributeName:UIColor.hrgb("333 ...