题目背景

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

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

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

题目描述

企鹅国中有 NN 座城市,编号从 11 到 NN 。

对于任意的两座城市 ii 和 jj ,企鹅们可以花费 (i~\mathrm{xor}~j) \times C(i xor j)×C 的时间从城市 ii 走到城市 jj ,这里 CC 为一个给定的常数。

当然除此之外还有 MM 条单向的快捷通道,第 ii 条快捷通道从第 F_iFi​ ​​ 个城市通向第 T_iTi​ ​​ 个城市,走这条通道需要消耗 V_iVi​ ​​ 的时间。

现在来自 Penguin Kingdom University 的企鹅豆豆正在考虑从城市 AA 前往城市 BB 最少需要多少时间?

输入输出格式

输入格式:

从标准输入读入数据。

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

接下来的 MM 行,每行三个正整数 F_i,T_i,V_iFi​,Ti​,Vi​ ​ (1 \leq F_i \leq N1≤Fi​≤N ,1 \leq T_i \leq N ,1\leq V_i \leq 1001≤Ti​≤N,1≤Vi​≤100 ),分别表示对应通道的起点城市标号、终点城市标号和通过这条通道需要消耗的时间。

最后一行两个正整数 A,BA,B (1 \leq C \leq 100)(1≤C≤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解释

直接从 11 走到 44 就好了。

样例2解释

先从 33 走到 22 ,再从 22 通过通道到达 44 ,再从 44 走到 66 。

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

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

如果暴力把图建出来的话,边的级别是O(N^2)的,肯定不行。。。暴力的局限在于没有用到异或的特殊性

如果我们从一个点i,每次直走到变某一位的点,最后走到j,那么满足至少存在一条 边权和= i xor j的路径,这个是比较显然的。

所以我们把这个图建出来然后再直接跑最短路就好啦。

但是要注意,要把n补到 2^i-1,因为有一些中间点会>n。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=200005;
int ci[33],n,m,d[maxn],val[maxn*37],C,S,T;
int hd[maxn],to[maxn*37],ne[maxn*37],num;
bool v[maxn];
struct node{
int x,dis;
bool operator <(const node &u)const{
return dis>u.dis;
}
};
priority_queue<node> q; inline void add(int u,int v,int w){
to[++num]=v,ne[num]=hd[u],hd[u]=num,val[num]=w;
} inline void dij(){
memset(d,0x3f,sizeof(d));
d[S]=0,q.push((node){S,0});
node x; while(!q.empty()){
x=q.top(),q.pop();
if(v[x.x]) continue; v[x.x]=1;
for(int i=hd[x.x];i;i=ne[i]) if(d[x.x]+val[i]<d[to[i]]){
d[to[i]]=d[x.x]+val[i];
q.push((node){to[i],d[to[i]]});
}
} printf("%d\n",d[T]);
} int main(){
ci[0]=1;
for(int i=1;i<=20;i++) ci[i]=ci[i-1]<<1; scanf("%d%d%d",&n,&m,&C);
int uu,vv,ww;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&uu,&vv,&ww);
add(uu,vv,ww);
}
scanf("%d%d",&S,&T); int U=n;
for(n=1;n<=U;n<<=1);
n--; for(int L=0;ci[L]<=n;L++)
for(int i=1,TO;i<=n;i++){
TO=i^ci[L];
if(TO) add(i,TO,ci[L]*C);
} dij(); return 0;
}

  

[Code Plus#4] 最短路的更多相关文章

  1. [luogu3952 noip2017] 逛公园 (计数dp+最短路)

    传送门 Description Input Output 输出文件包含 T 行,每行一个整数代表答案. Sample Input 2 5 7 2 10 1 2 1 2 4 0 4 5 2 2 3 2 ...

  2. [USACO09FEB] Revamping Trails 【分层图+Dijkstra】

    任意门:https://www.luogu.org/problemnew/show/P2939 Revamping Trails 题目描述 Farmer John dutifully checks o ...

  3. [Code+#4]最短路 (最短路)

    [Code+#4]最短路 题目背景 在北纬 91° ,有一个神奇的国度,叫做企鹅国.这里的企鹅也有自己发达的文明,称为企鹅文明.因为企鹅只有黑白两种颜色,所以他们的数学也是以二进制为基础发展的. 比如 ...

  4. [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路)

    [Codeforces 1197E]Culture Code(线段树优化建图+DAG上最短路) 题面 有n个空心物品,每个物品有外部体积\(out_i\)和内部体积\(in_i\),如果\(in_i& ...

  5. [Code+#4]最短路 解题报告

    Luogu · 传送门 Orz THU众大佬,lct(注意不是link-cut-tree,是一个大佬) 这道题很容易让人联想到 最短路,但是最短路需要先 建图: 暴力建出所有边的算法显然是不可行的,因 ...

  6. luoguP4366 [Code+#4]最短路 最短路

    好久没写过博客了.... 本题还是挺有趣的(很水的最短路) 关键在于怎么优化这$n^2$条连边 通常,我们希望用一些边来替代一条边从而减小边集 那么,注意到异或操作可以拆分成按位运算,因此我们只需考虑 ...

  7. [Luogu] P4366 [Code+#4]最短路

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

  8. luogu4366 [Code+#4]最短路[优化建边最短路]

    显然这里的$n^2$级别的边数不能全建出来,于是盯住xor这个关键点去 瞎猜 探究有没有什么特殊性质可以使得一些边没有必要建出来. 发现一个点经过一次xor $x$,花费$x$这么多代价(先不看$C$ ...

  9. luogu 4366 [Code+#4]最短路 Dijkstra + 位运算 + 思维

    这个题思路十分巧妙,感觉很多题都有类似的套路. 我们发现异或操作其实就是将一个数的二进制的若干个 $0$ 变成 $1$,或者一些 $1$ 变成 $0$. 而每次按照某种顺序一位一位地异或也可以起到同时 ...

随机推荐

  1. GIMP语言设置

    初学GIMP,需要设置语言:点击 编辑 - 首选项 其他的配置如: 配置快捷键 自己熟悉吧!

  2. python爬虫基础08-selenium大全2/8-Chrome Webdriver启动选项

    Selenium笔记(2)Chrome Webdriver启动选项 本文集链接:https://www.jianshu.com/nb/25338984 在Selenium中使用不同的Webdriver ...

  3. python学习第一天 计算机基础知识

    目录 什么是编程语言 什么是编程? 为什么要编程? 计算机5大组成分别有什么作用? qq启动的流程? 建议相关学习 课外 什么是编程语言 什么是编程语言? python和中文.英语一样,都是一门语言, ...

  4. PAT Basic 1055

    1055 集体照 拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每排人数为 N/K(向下取整),多出来的人全部站在最后一排: 后排所有人的个子都不比前排任何人矮: 每排 ...

  5. DocView mode 3 -- 配置

    ;在当前页中滚动doc-view-continuous nil ;指定默认的字体大小doc-view-resolution ;gs生成的缓存的目录doc-view-cache-directory

  6. 如何在eclipse中引用第三方jar包

    在用UiAutomator做手机自动化测试过程中,在UiAutomator的基础之上进一步封装了里边的方法,以使case开发更顺手.直接在工程的根目录下新建了个libs的文件夹,把封装好的框架打成ja ...

  7. 洛谷P3961 图的遍历

    题目来源 做这道题的方法不少. 在这里我只提一种 就是大法师. 可以采用反向建边,从最大的点开始dfs 我们考虑每次从所剩点中最大的一个点出发,我们暂且称它为i,而凡是i这个点所能到达的点,可以到达的 ...

  8. 关于面试总结-python笔试题

    关于面试总结4-python笔试题 前言 现在面试测试岗位,一般会要求熟悉一门语言(python/java),为了考验求职者的基本功,一般会出2个笔试题,这些题目一般不难,主要考察基本功. 要是给你一 ...

  9. 大数据学习——sqoop导入数据

    把数据从关系型数据库导入到hadoop 启动sqoop 导入表表数据到HDFS 下面的命令用于从MySQL数据库服务器中的emp表导入HDFS. sqoop import \ --connect jd ...

  10. 脑阔疼的双层SQLserver游标

    本来简单的双层游标没啥的,内层游标需要读取的是视图的内容,一直报“当前命令发生了严重错误.应放弃任何可能产生的结果.”的错误.无可奈何尝试先将视图的数据放到表变量中,之后再用游标遍历表变量. 简直很怀 ...