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. 解决UE4项目编辑器启动时出现LogLinker: Warning: Failed to load '/Game/FirstPersonBP/FirstPersonOverview': Can't find file.

    UE4版本:4.24.3源码编译版本 Windows10 + VS2019环境 LogLinker: Warning: Failed to load '/Game/FirstPersonBP/Firs ...

  2. SpringBoot整合Shiro 三:整合Mybatis

    搭建环境见: SpringBoot整合Shiro 一:搭建环境 shiro配置类见: SpringBoot整合Shiro 二:Shiro配置类 整合Mybatis 添加Maven依赖 mysql.dr ...

  3. Zookeeper之创建组,加入组,列出组成员和删除组

    public class CreateGroup implements Watcher { private static final int SESSION_TIMEOUT=5000; //ZooKe ...

  4. 零基础学习java------day18------properties集合,多线程(线程和进程,多线程的实现,线程中的方法,线程的声明周期,线程安全问题,wait/notify.notifyAll,死锁,线程池),

    1.Properties集合 1.1 概述: Properties类表示了一个持久的属性集.Properties可保存在流中或从流中加载.属性列表中每个键及其对应值都是一个字符串 一个属性列表可包含另 ...

  5. Mysql的行级锁

    我们首先需要知道的一个大前提是:mysql的锁是由具体的存储引擎实现的.所以像Mysql的默认引擎MyISAM和第三方插件引擎 InnoDB的锁实现机制是有区别的. Mysql有三种级别的锁定:表级锁 ...

  6. 【Java基础】ArrayList初始化操作

    要用60个零初始化列表,请执行以下操作: List<Integer> list = new ArrayList<Integer>(Collections.nCopies(60, ...

  7. 【Spark】【复习】Spark入门考前概念相关题复习

    Spark考前概念相关题复习 AUthor:萌狼蓝天 哔哩哔哩:萌狼蓝天 博客园:我的文章 - 萌狼蓝天 博客:萌狼工作室 - 萌狼蓝天 (mllt.cc) 选择题 Hadoop 1.HADOOP的三 ...

  8. 【C#】【MySQL】C#连接MySQL数据库(二)解析

    C# MySQL 实现简单登录验证 后端代码解析 Visual Studio中使用MySQL的环境配置 下文所有到的代码(前端后端) 请查阅这篇博文 C#连接MySQL数据库(一)代码 获取前端数据 ...

  9. DP笔记

    这是一篇蒟蒻被大佬踩爆后写的笔记 套路 0.贪心(废话)(排序...) 1.dp预处理出要用的东西 2.两头同时dp 3.化简题目中本质相同的东西 转化模型 4.数学计算优化 5.分析题目数据考虑该从 ...

  10. python使用gitlab-api

    目录 一.简介 二.示例 讲解 配置文件方式存储token 其它返回 三.其它操作 一.简介 公司使用gitlab 来托管代码,日常代码merge request以及其他管理是交给测试,鉴于操作需经常 ...