原题链接:https://www.luogu.org/problemnew/show/P4366

最短路

题目背景

在北纬 91° ,有一个神奇的国度,叫做企鹅国。这里的企鹅也有自己发达的文明,称为企鹅文明。因为企鹅只有黑白两种颜色,所以他们的数学也是以二进制为基础发展的。

比如早在 111010011110100111101001 年前,他们就有了异或这样一个数学概念。如果你不知道异或是什么,请出门过墙左转到这里。

再比如早在 100001010000101000010 年前,他们的大科学家 Penguin. Tu 就提出了图和最短路径这样一些概念。

题目描述

企鹅国中有 NNN 座城市,编号从 1" role="presentation" style="position: relative;">111 到 NNN 。

对于任意的两座城市 i" role="presentation" style="position: relative;">iii 和 jjj ,企鹅们可以花费 (i xor j)×C" role="presentation" style="position: relative;">(i xor j)×C(i xor j)×C(i~\mathrm{xor}~j) \times C 的时间从城市 iii 走到城市 j" role="presentation" style="position: relative;">jjj ,这里 CCC 为一个给定的常数。

当然除此之外还有 M" role="presentation" style="position: relative;">MMM 条单向的快捷通道,第 iii 条快捷通道从第 Fi" role="presentation" style="position: relative;">FiFiF_i ​​ 个城市通向第 TiTiT_i​​ 个城市,走这条通道需要消耗 ViViV_i​​ 的时间。

现在来自 P enguin K ingdom U niversity 的企鹅豆豆正在考虑从城市 AAA 前往城市 B" role="presentation" style="position: relative;">BBB 最少需要多少时间?

输入输出格式
输入格式:

从标准输入读入数据。

输入第一行包含三个整数 N,M,CN,M,CN,M,C ,表示企鹅国城市的个数、快捷通道的个数以及题面中提到的给定的常数 CCC 。

接下来的 M" role="presentation" style="position: relative;">MMM 行,每行三个正整数 Fi,Ti,Vi(1≤Fi≤N),1≤Ti≤N,1≤Vi≤100)Fi,Ti,Vi(1≤Fi≤N),1≤Ti≤N,1≤Vi≤100)F_i,T_i,V_i ( 1 \leq F_i \leq N),1 \leq T_i \leq N ,1\leq V_i \leq 100 ),分别表示对应通道的起点城市标号、终点城市标号和通过这条通道需要消耗的时间。

最后一行两个正整数 A,B(1≤C≤100)A,B(1≤C≤100)A,B (1 \leq C \leq 100) ,表示企鹅豆豆选择的起点城市标号和终点城市标号。

输出格式:

输出到标准输出。

输出一行一个整数,表示从城市 AA 前往城市 BB 需要的最少时间。

输入输出样例
输入样例#1:

4 2 1
1 3 1
2 4 4
1 4

输出样例#1:

5

输入样例#2:

7 2 10
1 3 1
2 4 4
3 6

输出样例#2:

34

说明

样例1解释

直接从 111 走到 4" role="presentation" style="position: relative;">444 就好了。

样例2解释

先从 333 走到 2" role="presentation" style="position: relative;">222 ,再从 222 通过通道到达 4" role="presentation" style="position: relative;">444 ,再从 444 走到 6" role="presentation" style="position: relative;">666 。

活泼可爱的出题人给大家留下了下面这张图。

Credit: https://www.luogu.org/discuss/show/38908

题解

凯老师洗澡时想出来的题。。。

暴力建图O(n2)O(n2)O(n^2),考虑如何优化建图:

点之间的编号变换可以看做二进制位上的逐步变换,所以我们将原来一条边从iii练到j" role="presentation" style="position: relative;">jjj变成iii分别向20,21,22,..." role="presentation" style="position: relative;">20,21,22,...20,21,22,...2^0,2^1,2^2,...分别连边,这样每个点向外连log2nlog2nlog_2n条边,就能表示所有转移,愉快ACACAC。

代码
#include<bits/stdc++.h>
using namespace std;
const int M=3e5+5;
struct sd{int to,len;};
bool operator <(sd a,sd b){return a.len>b.len;}
int s,t,mx,n,m,k,dis[M];
vector<sd>mmp[M];
priority_queue<sd>dui;
void in()
{int a,b,c;scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=m;++i)scanf("%d%d%d",&a,&b,&c),mmp[a].push_back((sd){b,c});scanf("%d%d",&s,&t);
}
void build()
{for(mx=1;mx<n;mx<<=1);for(int i=1;i<=n;++i)for(int j=1;j<=mx;j<<=1)mmp[i].push_back((sd){i^j,j*k}),mmp[i^j].push_back((sd){i,j*k});
}
void dijkstra()
{memset(dis,63,sizeof(dis));dis[s]=0;dui.push((sd){s,0});sd f,t;while(!dui.empty()){f=dui.top();dui.pop();for(int i=mmp[f.to].size()-1;i>=0;--i){t=mmp[f.to][i];if(dis[t.to]>dis[f.to]+t.len)dis[t.to]=dis[f.to]+t.len,dui.push((sd){t.to,dis[t.to]});}}
}
void ac(){build();dijkstra();printf("%d",dis[t]);}
int main(){in();ac();}

Luogu4366[CodePlus#4] 最短路相关推荐

  1. [C] [最短路] 只有5行的算法:Floyd-Warshall

    终于学到求最短路了,终于来到我最喜欢的算法--Floyd-Warshall了!今天还有点小激动呢! 我喜欢它,当然是因为它逻辑十分简单咯!真的只有5行诶! Floyd-Warshall算法 题目描述 ...

  2. BZOJ4152 AMPPZ2014 The Captain(最短路)

    事实上每次走到横坐标或纵坐标最接近的点一定可以取得最优方案.于是这样连边跑最短路就可以了. #include<iostream> #include<cstdio> #inclu ...

  3. Codeforces.1051F.The Shortest Statement(最短路Dijkstra)

    题目链接 先随便建一棵树. 如果两个点(u,v)不经过非树边,它们的dis可以直接算. 如果两个点经过非树边呢?即它们一定要经过该边的两个端点,可以直接用这两个点到 u,v 的最短路更新答案. 所以枚 ...

  4. BZOJ1491: [NOI2007]社交网络(Floyd 最短路计数)

    Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 2343  Solved: 1266 [Submit][Status][Discuss] Descrip ...

  5. HDU1811 Rank of Tetris 拓扑排序+并查集 OR 差分约束最短路+并查集

    题目链接 题意:就是给你一堆关系,看能不能排出个确定的顺序 做法: 1. 拓扑排序+并查集 应该很容易想到的一种思路,大于小于建立单向边.对于相等的呢,就把他们缩成一个点.就用并查集缩成一个点就行了 ...

  6. E:By Elevator or Stairs? CF595 DP最短路

    题目链接 比赛的时候一看,这不是最短路吗,然后敲了一个最短路. 然后比赛完发现大家基本都写的dp,我真是个憨憨,dp3行 最短路就建个简单的图,dp就是从上一维转化过来就是了 优秀的dp: //#pr ...

  7. The Shortest Statement CodeForces - 1051F LCA+最短路

    太弱了... 一开始看到题感觉是跑一个最小生成树在上边进行LCA就行了,但是发现过不了样例,然后就是就想到了之前做过类似做法的题目,就是非生成树上的边最多只有21条,然后就那些边记录下来,通过每一条边 ...

  8. JZOJ #4722 跳楼机 (最短路模型的完美转化)

    题目描述: 给出$h,x,y,z$,求在$h$以内,$x,y,z$可以凑出多少个不同的数.$(1\leq{h}\leq{10^{18}},1\leq{x,y,z}\leq{10^5})$ 解题思路: ...

  9. matlab单机无限大系统_基于MATLAB的单机无穷大系统短路故障分析_吕鹏

    _______________________________电子技术__丝I 基于MA丁LAB的单机无穷大系统短路故障分析 山东科技大学吕鹏钟家成纪妮妮李漫漫 [摘要]本z l),NIATLAB7. ...

  10. 【二分答案】【最短路】bzoj1614 [Usaco2007 Jan]Telephone Lines架设电话线

    对于二分出的答案x而言,验证答案等价于将所有边权>x的边赋成1,否则赋成0,然后判断从1到n的最短路是否<=K. #include<cstdio> #include<cs ...

最新文章

  1. IT运维包括最基本的三个方面
  2. SVN中trunk、branch、tag区别
  3. PostgreSQL处理xml数据初步
  4. python自动测试e_python实现hive自动化测试
  5. medical research
  6. 如何运行一段python代码_Python退出时强制运行一段代码如何实现 Python退出时强制运行一段代码实现方法...
  7. 非域计算机上模拟域用户,App-V如何让非域内(工作组)PC 也能享受应用程序虚拟化...
  8. guid主分区表损坏怎么办_抹盘提示进程失败,导致Win 10无法正常开机怎么办?...
  9. 树莓派zero+mysql_关于树莓派zero的系统安装配置部署
  10. Win10装Ubuntu双系统步骤做法
  11. J2SE下的路径问题
  12. notebook打开外部文件_NOTEBOOK文件扩展名 - 什么是.notebook以及如何打开? - ReviverSoft...
  13. 百分点感知智能实验室:语音识别技术发展阶段探究
  14. 阿里巴巴Java开发手册(2018-2021泰山版整理)
  15. Java课程设计之简易计算器:设计的计算器应用程序是基于AWT的,可以完成加法、减法、乘法、除法和取余运算。
  16. java 分号作用_java枚举类型中分号的用法
  17. Android 使用讯飞语音SDK
  18. 阿里云禁止root用户直接登录的解决办法
  19. 《分布式计算云计算与大数据》第一章
  20. 从开发者到讲师的心路历程

热门文章

  1. mysql loader_Mysql的批量导入类 MySqlBulkLoader
  2. 766.托普利茨矩阵(力扣leetcode) 博主可答疑该问题
  3. 简单解决 Blocked a frame with origin XXX from accessing a cross-origin 。iframe跨域问题
  4. java odbc timesten_TimesTen ODBC 链接库差异及相关命令行工具的使用注意事项
  5. openjudge1.2
  6. jQuery----分页插件实现
  7. 理解 Objective-c 属性
  8. asp.net 写入excel时,不能更新。数据库或对象为只读。
  9. html中ip输入格式正则表达式,通过正则表达式验证IP和端口格式的正确性
  10. SpringApplication#run⽅法的第6步,创建ApplicationContext(五)