[Code+#4]最短路 (最短路)
[Code+#4]最短路
题目背景
在北纬 91° ,有一个神奇的国度,叫做企鹅国。这里的企鹅也有自己发达的文明,称为企鹅文明。因为企鹅只有黑白两种颜色,所以他们的数学也是以二进制为基础发展的。
比如早在 1110100111101001 年前,他们就有了异或这样一个数学概念。如果你不知道异或是什么,请出门过墙左转到这里。
再比如早在 10000101000010 年前,他们的大科学家 Penguin. Tu 就提出了图和最短路径这样一些概念。
题目描述
企鹅国中有 N 座城市,编号从 1 到 N 。
对于任意的两座城市 i 和 j ,企鹅们可以花费 \((i~\mathrm{xor}~j) \times C\) 的时间从城市 i 走到城市 j ,这里 C 为一个给定的常数。
当然除此之外还有 \(M\) 条单向的快捷通道,第 \(i\) 条快捷通道从第 \(F_i\) 个城市通向第 \(T_i\) 个城市,走这条通道需要消耗 \(V_i\) 的时间。
现在来自 Penguin Kingdom University 的企鹅豆豆正在考虑从城市 A 前往城市 B 最少需要多少时间?
输入输出格式
输入格式:
从标准输入读入数据。
输入第一行包含三个整数 \(N,M,C\) ,表示企鹅国城市的个数、快捷通道的个数以及题面中提到的给定的常数CC。
接下来的 M 行,每行三个正整数 \(F_i,T_i,V_i (1≤Fi≤N,1 \leq T_i \leq N ,1\leq V_i \leq 100)\),分别表示对应通道的起点城市标号、终点城市标号和通过这条通道需要消耗的时间。
最后一行两个正整数 A,B \((1 \leq C \leq 100)\),表示企鹅豆豆选择的起点城市标号和终点城市标号。
输出格式:
输出到标准输出。
输出一行一个整数,表示从城市 A 前往城市 B 需要的最少时间。
输入输出样例
输入样例#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解释
直接从 1 走到 4 就好了。
样例2解释
先从 3 走到 2 ,再从 2 通过通道到达 4 ,再从 4 走到 6。

题解
一道思路非常巧妙的题目。
在这里我们要充分利用到异或的性质。
我们知道如果 A^ B ^ C ^ D =A^E时。
就直接建边A->E了。
也就是说,有些边是多余的。
那么我们怎么确保必要的边呢?
一个点到只需要连接n的每一个二进制的1就可以了。
因为所有的异或情况都可以由二进制组合出来。
那么边就是\(m+log(n)\)的。
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N=4000001;
struct node{
int to,v,nex;
}e[N];
int num,head[N];
int n,m,c,s,t,dis[N],vis[N];
int read(){
int x=0,w=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
void add(int from,int to,int v){
num++;
e[num].to=to;
e[num].v=v;
e[num].nex=head[from];
head[from]=num;
}
void dijkstra(){
priority_queue<pair<int,int> >q;
memset(dis,63,sizeof(dis));dis[s]=0;
q.push(make_pair(-dis[s],s));
while(!q.empty()){
int u=q.top().second;q.pop();
if(vis[u])continue;vis[u]=1;
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(dis[v]>dis[u]+e[i].v){
dis[v]=dis[u]+e[i].v;
q.push(make_pair(-dis[v],v));
}
}
}
}
int main(){
n=read();m=read();c=read();
for(int i=1;i<=m;i++){
int x=read(),y=read(),z=read();
add(x,y,z);
}
for(int i=0;i<=n;i++){
for(int j=1;j<=n;j<<=1){
if((j^i)>n)continue;
add(i,(i^j),j*c);
}
}
s=read();t=read();
dijkstra();
printf("%d\n",dis[t]);
return 0;
}
[Code+#4]最短路 (最短路)的更多相关文章
- 算法笔记--次小生成树 && 次短路 && k 短路
1.次小生成树 非严格次小生成树:边权和小于等于最小生成树的边权和 严格次小生成树: 边权和小于最小生成树的边权和 算法:先建好最小生成树,然后对于每条不在最小生成树上的边(u,v,w)如果我们 ...
- luoguP4366 [Code+#4]最短路 最短路
好久没写过博客了.... 本题还是挺有趣的(很水的最短路) 关键在于怎么优化这$n^2$条连边 通常,我们希望用一些边来替代一条边从而减小边集 那么,注意到异或操作可以拆分成按位运算,因此我们只需考虑 ...
- php短路与 短路或
关于php短路的问题特性,三种写法的区别 $a = 1;$b=0;第一种: $a && $b = 'cccccccc';第二种 $a || $b = 'cccccccc';第三种 if ...
- hdu 2544最短路——最短路的初次总结 UESTC 6th Programming Contest Online
这是一道标准的模板题,所以拿来作为这一段时间学习最短路的总结题目. 题意很简单: 有多组输入数据,每组的第一行为两个整数n, m.表示共有n个节点,m条边. 接下来有m行,每行三个整数a, b, c. ...
- BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路( 最短路 )
从起点和终点各跑一次最短路 , 然后枚举每一条边 , 更新answer ---------------------------------------------------------------- ...
- HDU2544-最短路(最短路模版题目)
Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要 ...
- 最短路 次短路 k短路(k很小)
最短路 luogu 3371 https://www.luogu.org/problemnew/show/P3371 #include <cstdio> #include <cstd ...
- LOJ#6354. 「CodePlus 2018 4 月赛」最短路[最短路优化建图]
题意 一个 \(n\) 个点的完全图,两点之间的边权为 \((i\ xor\ j)*C\) ,同时有 \(m\) 条额外单向路径,问从 \(S\) 到 \(T\) 的最短路. \(n\leq 10^5 ...
- BZOJ1726: [Usaco2006 Nov]Roadblocks第二短路 K短路
Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样, ...
- HAOI 2005 路由选择问题 (最短路+次短路)
问题描述 X城有一个含有N个节点的通信网络,在通信中,我们往往关心信息从一个节点I传输到节点J的最短路径.遗憾的是,由于种种原因,线路中总有一些节点会出故障,因此在传输中要避开故障节点. 任务一:在己 ...
随机推荐
- (转载)Android UI设计之AlertDialog弹窗控件
Android UI设计之AlertDialog弹窗控件 作者:qq_27630169 字体:[增加 减小] 类型:转载 时间:2016-08-18我要评论 这篇文章主要为大家详细介绍了Android ...
- (转载)自定义ExpandableListView,实现二级列表效果
先看效果图: 上图是我们要实现的效果,那么现在我们开始着手去做,主要分为以下几步: 一丶我们需要根据效果图去思考该如何动手,从上图分析看,我们可以用一个相对布局RelativeLayout来完成gro ...
- PHP通过DOM操作XML
PHP XML操作类DOMDocument属性及方法 注意大小写一定不能弄错. 属性: Attributes 存储节点的属性列表(只读) childNodes 存储节点的子节点列表(只读) dataT ...
- 洛谷 P1005 矩阵取数游戏 (区间dp+高精度)
这道题大部分时间都在弄高精度-- 还是先讲讲dp吧 这道题是一个区间dp,不过我还是第一次遇到这种类型的区间dp f[i][j]表示取了数之后剩下i到j这个区间的最优值 注意这里是取了i之前和j之后的 ...
- 【codeforces 348B】Apple Tree
[题目链接]:http://codeforces.com/problemset/problem/348/B [题意] 给你一棵树; 叶子节点有权值; 对于非叶子节点: 它的权值是以这个节点为根的子树上 ...
- 安装spark问题汇总
使用的版本是 spark-1.6.3-bin-without-hadoop 运行spark-shell报错 运行spark-sql报错找不到org.datanucleus.api.jdo.JDOPer ...
- 从头认识java-18.6 synchronized在其它对象上同步和ThreadLocal来消除共享对象的同步问题
这一章节我们来介绍在其它对象上同步与ThreadLocal. 前一章节我们使用了 1.synchronized在其它对象上同步 class ThreadA implements Runnable { ...
- 你的Android应用完全不需要那么多的权限
Android系统的权限从用户的角度来看有时候的确有点让人摸不着头脑.有时候可能你只需要做一些简单的事情(对联系人的信息进行编辑),却申请了远超你应用所需的权限(比如访问所有联系人信息的权限). 这很 ...
- JavaScript检查手机格式是否错误
编写自己定义的JavaScript函数checkPhone(),在函数中应用正則表達式推断手机号码的格式是否正确,不对的给出提示 <script type="text/javascri ...
- [Python]Use Flask-Admin with PostgreSQL
This code recipe gives you an idea of how to use Flask-Admin with postgresql database. from flask im ...