当前位置: 首页 > news >正文

【Luogu】每日一题——Day20. P4366 [Code+#4] 最短路 (图论)

P4366 [Code+#4] 最短路 - 洛谷

题目:

思路:

其实是找性质

本题我们首先可以想到的就是建图然后跑最短路,但是数据给的很大,如果直接暴力建图显然不行,考虑一些特殊情况需要建图

考虑 1 -> 7 这个例子

我们一种走法是直接从 1->7,那么二进制下就是 001 -> 111,花费就是 6 * c

另一种走法就是考虑走中间节点,具体的从 001 -> 011 -> 111,花费一样也是 6 * c

可以看出,只要两个数有超过一位不同,那么就能通过中间节点走到终点

具体的,我们每个数都建一条和自己有一位不同的边,那么其连接的点就是 i ^ 2^{k},即只有一位不同,这个位可以是 32 位中的任意一位,所以价值就是 c * (i ^ (i ^ 2^{k})) = c * 2^{k}

所以就从 n*n 变成了 n*logn 的建图了,顺利解决

代码:

#include <iostream>
#include <algorithm>
#include<cstring>
#include <iomanip>
#include<cctype>
#include<string>
#include <set>
#include <vector>
#include <cmath>
#include <queue>
#include <unordered_set>
#include <map>
#include <unordered_map>
#include <stack>
#include <utility>
#include <array>
#include <tuple>
using namespace std;
#define int long long
#define yes cout << "YES" << endl
#define no cout << "NO" << endlvector<vector<pair<int,int>>> g(100005);
int n, m, c;
int dis[100005];
int s, e;void Init()
{for (int i = 0; i <= n; i++){for (int j = 1; j <= n; j <<= 1){if ((i ^ j) > n)continue;g[i].push_back({ i ^ j, j * c });}}
}void fuc()
{dis[s] = 0;priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;pq.push({ 0,s });while (!pq.empty()){auto t = pq.top();pq.pop();if (t.second == e || dis[t.second] < t.first){continue;}for (auto & son : g[t.second]){int v = son.first;int cost = son.second;if (dis[v] > t.first + cost){dis[v] = t.first + cost;pq.push({ t.first + cost ,v });}}}
}void solve()
{cin >> n >> m >> c;for (int i = 0; i < m; i++){int u, v, c;cin >> u >> v >> c;g[u].push_back({ v, c });}cin >> s >> e;Init();memset(dis, 0x3f, sizeof dis);fuc();cout << dis[e] << endl;
}
signed main()
{//cin.tie(0)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--){solve();}return 0;
}

http://www.lryc.cn/news/623670.html

相关文章:

  • 计算机网络 Session 劫持 原理和防御措施
  • 【Luogu】每日一题——Day21. P3556 [POI 2013] MOR-Tales of seafaring (图论)
  • 裸机框架:按键模组
  • 深度学习之优化器
  • 概率论基础教程第4章 随机变量(一)
  • 《Cocos游戏开发入门一本通》第四章
  • 李宏毅NLP-11-语音合成
  • 神经网络中的梯度概念
  • 显式编程(Explicit Programming)
  • c++--文件头注释/doxygen
  • 系统学习算法 专题十七 栈
  • C++ 特殊类设计与单例模式解析
  • 编译器生成的合成访问方法(Synthetic Accessor Method)
  • Python训练营打卡Day35-复习日
  • Spring Framework :IoC 容器的原理与实践
  • 库制作与原理(下)
  • HAL-EXTI配置
  • Python异常、模块与包(五分钟小白从入门)
  • STL 容器
  • 【Linux网络编程】NAT、代理服务、内网穿透
  • Windows 10共享打印机操作指南
  • 第七十八章:AI的“智能美食家”:输出图像风格偏移的定位方法——从“滤镜病”到“大师风范”!
  • Flutter 3.35 更新要点解析
  • 解码词嵌入向量的正负奥秘
  • 【R语言】R语言矩阵运算:矩阵乘除法与逐元素乘除法计算对比
  • Flutter vs Pygame 桌面应用开发对比分析
  • SQL Server 2019安装教程(超详细图文)
  • ZKmall开源商城的移动商城搭建:Uni-app+Vue3 实现多端购物体验
  • 【Linux系统】动静态库的制作
  • 雷卯针对香橙派Orange Pi 5 Ultra开发板防雷防静电方案