[Code+#4] 最短路 - 建图优化,最短路
最短路问题,然而对于任意\(i,j\),从\(i\)到\(j\)可以只花费\((i xor j) \cdot C\)
对每个点\(i\),只考虑到\(j\)满足\(j=i xor 2^k, j \leq i\)
显然其它边可以由这些边组合得到
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAX_NODE = 500005;
template <class T> class Graph_SP { // 解决单源最短路径问题
public:
vector<pair<int, T> >G[MAX_NODE];
int d[MAX_NODE], v[MAX_NODE]; // 距离表与访问标识表
void make(int t1, int t2, T t3) { // 造边(有向)
G[t1].push_back(make_pair(t2, t3));
}
void reset_graph(int n) { // 用于清除图邻接表
for (int i = 0; i <= n; i++)
G[i].clear();
}
void reset_solver(int n) { // 对距离表与访问标识表的清除 如果改变了类型,该函数可能需要重写!
memset(d, 0x3f, sizeof d);
memset(v, 0x00, sizeof v);
}
void solveDijkstra(int v0, int n) { // 执行主计算任务(使用Dijkstra)
priority_queue<pair<T, int>, vector<pair<T, int> >, greater<pair<T, int> > >q;
reset_solver(n); // 自动调用对距离表与访问标识表的清除
d[v0] = 0;
q.push(make_pair(0, v0));
while (q.size()) {
pair<T, int> p = q.top();
T dis = p.first; // dis为到当前点的距离
int pos = p.second; // pos为当前点
q.pop();
v[pos] = 1;
for (int i = 0; i < G[pos].size(); i++) {
int x = G[pos][i].first; // x为当前枚举边的终点,
T y = G[pos][i].second; // y为当前枚举边的权值
if (d[x] > d[pos] + y) {
d[x] = d[pos] + y;
if (!v[x])
q.push(make_pair(d[x], x));
}
}
}
}
} ;
Graph_SP <int> g;
signed main() {
int n,m,k,t1,t2,t3,a,b;
scanf("%lld%lld%lld",&n,&m,&k);
for(int i=1;i<=m;i++) {
scanf("%lld%lld%lld",&t1,&t2,&t3);
g.make(t1,t2,t3);
}
scanf("%lld%lld",&a,&b);
for(int i=0;i<=n;i++) {
for(int p=0;p<=20;p++) {
int j=i^(1ll<<p);
if(j<=n) g.make(i,j,k*(1ll<<p));
}
}
g.solveDijkstra(a,n);
cout<<g.d[b]<<endl;
}
[Code+#4] 最短路 - 建图优化,最短路的更多相关文章
- 『The Captain 最短路建图优化』
The Captain(BZOJ 4152) Description 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小 ...
- BZOJ4383/LuoGuP3588 Pustynia/PUS 线段树建图优化
我会告诉你我看了很久很久才把题目看懂吗???怀疑智商了 原来他给的l,r还有k个数字都是下标... 比如给了一个样例 l, r, k, x1,x2,x3...xk,代表的是一个数组num[l]~num ...
- B - Legacy CodeForces - 787D 线段树优化建图+dij最短路 基本套路
B - Legacy CodeForces - 787D 这个题目开始看过去还是很简单的,就是一个最短路,但是这个最短路的建图没有那么简单,因为直接的普通建图边太多了,肯定会超时的,所以要用线段树来优 ...
- HDU 5521 [图论][最短路][建图灵感]
/* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相 ...
- NOIP2013 华容道 (棋盘建图+spfa最短路)
#include <cstdio> #include <algorithm> #include <cstring> #include <queue> # ...
- poj 2135 Farm Tour 最小费用最大流建图跑最短路
题目链接 题意:无向图有N(N <= 1000)个节点,M(M <= 10000)条边:从节点1走到节点N再从N走回来,图中不能走同一条边,且图中可能出现重边,问最短距离之和为多少? 思路 ...
- hdu4725 The Shortest Path in Nya Graph【最短路+建图】
转载请注明出处,谢谢:http://www.cnblogs.com/KirisameMarisa/p/4297574.html ---by 墨染之樱花 题目链接:http://acm.hdu ...
- hdu 4885 (n^2*log(n)推断三点共线建图)+最短路
题意:车从起点出发,每次仅仅能行驶L长度,必需加油到满,每次仅仅能去加油站或目的地方向,路过加油站就必需进去加油,问最小要路过几次加油站. 開始时候直接建图,在范围内就有边1.跑最短了,再读题后发现, ...
- Codeforces 938D. Buy a Ticket (最短路+建图)
<题目链接> 题目大意: 有n座城市,每一个城市都有一个听演唱会的价格,这n座城市由m条无向边连接,每天变都有其对应的边权.现在要求出每个城市的人,看一场演唱会的最小价值(总共花费的价值= ...
随机推荐
- dotnetcore3.1 WPF 实现多语言
dotnetcore3.1 WPF 实现多语言 Intro 最近把 DbTool 从 WinForm 迁移到了 WPF,并更新到了 dotnet core 3.1,并实现了基于 Microsoft.E ...
- C#设计模式学习笔记:(21)访问者模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/8135083.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲行为型设计模式的第九个模式--访 ...
- rpm 程序包管理介绍
API:application program interface ABI:application binary interface linux系统的ABI文件是ELF格式的 windows系统的AB ...
- Vue整合d3.v5.js制作--柱状图(rect)
先上效果图: 图中柱状图变成纯蓝色是鼠标滑动过的颜色(颜色可改,本人配色能力十分的强,建议直接用默认设置即可 ( ᖛ ̫ ᖛ )ʃ)) 1.环境说明 Vue版本:"vue": &q ...
- 20200117 .net 001
第一部分:面向对象 封装 继承(里氏转换) 多态第二部分:值类型.引用类型.字符串操作第三部分:集合文件操作第四部分:正则表达式第五部分:XML操作第六部分:委托.事件第七部分:反射. 1.变量的命名 ...
- vue中允许你继续使用swiper的组件 vue-awesome-swiper---切图网
swiper是一个在切图中好用到不行的图片轮播插件,包括3d轮播.h5滑屏等复杂应用都不在话下,到了vue项目一切逻辑完全颠覆了,没有获取dom的概念,还好有 vue-awesome-swiper组件 ...
- day 17 初始递归
递归函数 了解什么是递归 : 在函数中调用自身函数 最大递归深度默认是997/998 —— 是python从内存角度出发做的限制 能看懂递归 能知道递归的应用场景 初识递归 —— 算法 —— 二分查找 ...
- DotnetCore 单文件发布
NETCORE3.0开始,可以发布单文件,参考https://www.cnblogs.com/ZaraNet/p/11790645.html 发布后(config目录 是手工复制进去的) 运行时, ...
- js增删class的方法
接下来我来介绍两种方法 我们先来一段HTMl代码 <div id="bb"> 你好呀 </div> 接下来我们再来一段css样式 .ob { color:r ...
- 为什么要进行初始化(C语言)
答案:是为了清除被释放的内存中保存的以前程序中留下的垃圾数据.