基里巴斯(path)

题目描述

最近,帕特里克沉迷于世界地图上的太平洋地区。他发现了一个名字奇异的岛国:基里巴斯共和国,简称基里巴斯,是一个太平洋岛国。

其由33个岛屿组成。

“可惜它快被淹没了,该死的全球变暖”。

真悲哀。

我们这里讨论其在四维平行宇宙中的另一个国家:巴里基斯。这个国家由NN个岛屿或岛礁组成。

由于岛屿众多,政府在所有的岛屿之间均设有固定的经济航线连接。对于编号为u,v的岛屿(u,v)对,连接两岛的单向航线通行费用是(u⊕v)×K。其中,⊕表示异或(Xor)。

泛美航空公司开设了MM条往返于各岛的单向航线,每条航线均有一个固定的通行费用以期以更低的价格占有更多的用户群。

另外,泛美打算在岛礁中心建设了一个机场作为中转枢纽,这个枢纽建成后或许能大大降低泛美的航空成本。但是作为邪恶的资本主义财团,董事长还是希望调研一下收益。

于是,他打算从SS飞到城市TT。他希望得知从SS到城市TT的最小费用。

输入

输入第一行包含三个整数N,M,K,含义如题所示。

接下来MM行,每行三个整数ui,vi,wi描述一条单向航线。

最后一行两个整数S,T,表示想要调研的起点和终点。

输出

输出包含一个整数,为从SS到城市TT的最小费用。

样例输入

【样例1输入】
5 3 3
1 3 2
2 4 4
2 3 2
1 5
【样例2输入】
1000 1 85
829 630 1
633 492

样例输出

【样例1输出】
12
【样例2输出】
77945

提示

对于所有测试数据,保证:1≤K≤103,1≤wi≤105,1≤ui,vi≤n1≤K≤103,1≤wi≤105,1≤ui,vi≤n

详细部分分见下表:

测试点

N

M

1

≤105≤105

=0

2

=1

3

=2

4

=3

5

=10

6-7

≤103≤103

8-10

≤103≤103

11-20

≤2×105≤2×105

≤106≤106

数据不保证无重边。

来源

lhy

solution

对于点i

把每一位分离出来

若i的着一位为0 则lj(i,i+(1<<j))

若为1 则lj(i,i-(1<<j))

这样就能走遍所有点,边数nlogn+m

这题卡spfa。。。

很久没写dijkstra,忘光

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define maxn 200005
#define inf 1e9
using namespace std;
int n,m,K,tot,t1,t2,t3,head[maxn],S,T;
int d[maxn];
struct node{
int v,nex;
int w;
}e[8000005];
struct no{
int x,v;
bool operator <(const no &T)const{return v>T.v;}
};
priority_queue<no>q;
void lj(int t1,int t2,int t3){
e[++tot].v=t2;e[tot].w=t3;e[tot].nex=head[t1];head[t1]=tot;
}
bool flag[maxn];
int main()
{
cin>>n>>m>>K;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&t1,&t2,&t3);
lj(t1,t2,t3);
}
cin>>S>>T;
for(int i=1;i<=n;i++){
for(int j=0;j<=22;j++){
if(i&(1<<j)){
int ne=i-(1<<j);
if(ne<=n)lj(i,ne,(1<<j)*K);
}
else {
int ne=i+(1<<j);
if(ne<=n)lj(i,ne,(1<<j)*K);
}
}
}
for(int i=1;i<=n;i++)d[i]=inf;
d[S]=0;no t;t.x=S,t.v=0;
q.push(t);
for(int i=1;i<=n;i++){
if(q.empty())break;
no k;
while(flag[q.top().x]&&!q.empty())q.pop();
if(!q.empty())k=q.top();
else break;
flag[k.x]=1;
if(k.x==T)break;
for(int i=head[k.x];i;i=e[i].nex){
if(d[e[i].v]>d[k.x]+e[i].w&&!flag[e[i].v]){
d[e[i].v]=d[k.x]+e[i].w;
t.x=e[i].v,t.v=d[e[i].v];
q.push(t);
}
}
}
cout<<d[T]<<endl;
return 0;
}

基里巴斯(path)的更多相关文章

  1. NodeJs之Path

    Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...

  2. 【原】实时渲染中常用的几种Rendering Path

    [原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...

  3. Node.js:path、url、querystring模块

    Path模块 该模块提供了对文件或目录路径处理的方法,使用require('path')引用. 1.获取文件路径最后部分basename 使用basename(path[,ext])方法来获取路径的最 ...

  4. VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%

    1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...

  5. Leetcode 笔记 113 - Path Sum II

    题目链接:Path Sum II | LeetCode OJ Given a binary tree and a sum, find all root-to-leaf paths where each ...

  6. Leetcode 笔记 112 - Path Sum

    题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...

  7. Thinking in Unity3D:渲染管线中的Rendering Path

      关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的 ...

  8. node之path模块

    node之path模块 原文链接 //引用该模块 var path = require("path"); 1.路径解析,得到规范化的路径格式 对window系统,目录分隔为'', ...

  9. Linux系统修改PATH环境变量方法

    在Linux安装一些软件通常要添加路径环境变量PATH.PATH环境变量通俗的讲就是把程序的路径"备案"到系统中,这样执行这些程序时就不需要输入完整路径,直接在bash输入程序名就 ...

随机推荐

  1. Python判断一个数是否为小数

    一.判断一个数是否为小数 1.有且仅有一个小数点 2.小数点的左边可能为正数或负数 3.小数点的右边为正数 二.实现代码 def is_float(str): if str.count('.') == ...

  2. 重温 JSP 与 Servlet

    Java Web使用SSH框架多了,很多基础的 JSP 与 Servlet 的东西都忘记了.最近在 JSP 标签 和 Struts2 包装的 Session 对象的混合使用时弄晕了,就翻书温习下. J ...

  3. 处理侧滑返回与 ScrollView 手势冲突

    与处理双击.单击手势互斥原则一样: // 手势互斥(侧滑返回手势失效后才响应UITableView的滑动手势) [tableView.panGestureRecognizer requireGestu ...

  4. SunmmerVocation_Learning--Java数组的创建

    一维数组声明方式: type var[] 或 type[] var; 如int a[], int[] a; Java中声明数组不能指定其长度,如int a[5]是非法的. 一维数组对象的创建: Jav ...

  5. jsp引用servlet生成的验证码代码演示

    此演示代码主要包括以下三部分:1.checkCode.java:用于生成验证码2.checkCodeServler3.check.jsp 验证 下面是checkCode.java的内容: 复制代码代码 ...

  6. ubuntu18.04 and Linux mint 19安装virtualbox

    1.1  安装Virtualbox root@amarsoft-ZHAOYANG-K43c-:~# apt-get install virtualbox -y 1.2  显示Virtualbox桌面图 ...

  7. day 63 Django基础九之中间件

    Django基础九之中间件   本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学 ...

  8. Linux 面试的一些基础命令

    1.查询服务器负载 (1)uptime [root@oldboy ~]# uptime 20:17:18 up 7:41, 2 users, load average: 0.00, 0.00, 0.0 ...

  9. linux硬件基础

    1. 服务器分类 机架式服务器(主要用这个). 刀片式服务器. 塔式服务器. 2. 机架式服务器 服务器的尺: U - 2U. 服务器核心之电源: 双电源 AB 路. 服务器核心之 CPU-计算 CP ...

  10. oracle 事务 第一弹

    一.事务概念 概念:在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么完全成功执行,完成整个工作单元操作,要么一点 ...