[Luogu] P4366 [Code+#4]最短路】的更多相关文章

题目背景 在北纬 91° ,有一个神奇的国度,叫做企鹅国.这里的企鹅也有自己发达的文明,称为企鹅文明.因为企鹅只有黑白两种颜色,所以他们的数学也是以二进制为基础发展的. 比如早在 111010011110100111101001 年前,他们就有了异或这样一个数学概念.如果你不知道异或是什么,请出门过墙左转到这里. 再比如早在 100001010000101000010 年前,他们的大科学家 Penguin. Tu 就提出了图和最短路径这样一些概念. 题目描述 企鹅国中有 NNN 座城市,编号从…
这个题思路十分巧妙,感觉很多题都有类似的套路. 我们发现异或操作其实就是将一个数的二进制的若干个 $0$ 变成 $1$,或者一些 $1$ 变成 $0$. 而每次按照某种顺序一位一位地异或也可以起到同时异或多位的结果. 所以我们每次只要把每个节点连到只该变一位的节点就可以了. 然后就直接跑一个最短路~ #include <cstdio> #include <algorithm> #include <cstring> #include <queue> #defi…
[Code+#4]最短路 题目背景 在北纬 91° ,有一个神奇的国度,叫做企鹅国.这里的企鹅也有自己发达的文明,称为企鹅文明.因为企鹅只有黑白两种颜色,所以他们的数学也是以二进制为基础发展的. 比如早在 1110100111101001 年前,他们就有了异或这样一个数学概念.如果你不知道异或是什么,请出门过墙左转到这里. 再比如早在 10000101000010 年前,他们的大科学家 Penguin. Tu 就提出了图和最短路径这样一些概念. 题目描述 企鹅国中有 N 座城市,编号从 1 到…
题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易可以想到一个做法,就是魔改迪杰斯特拉做法: 如果一个点可以更新到达其他点的距离,那个点的方案数就是这个点的方案数:如果一个点所更新出来的距离和之前的相等,那个点的方案数加等当前点的方案数. 用式子可以表现为: f[j]=f[i] (dis[j]>dis[i]+x)   f[j]+=f[i] (dis…
Luogu · 传送门 Orz THU众大佬,lct(注意不是link-cut-tree,是一个大佬) 这道题很容易让人联想到 最短路,但是最短路需要先 建图: 暴力建出所有边的算法显然是不可行的,因为这样会建出 \(O(n^2 + m)\) 条边: 那么我们要考虑能不能 减少一些边 ,使边的数量可以接受. 从哪里入手减少边的数量呢?异或或许是一个不错的切入口. 举个栗子: 假设我们要从 \(001_2\) 到 \(010_2\),我们要花费 \(2^0 + 2^1\) 的费用: 但是,最短路有…
https://loj.ac/problem/6354 https://www.luogu.org/problemnew/show/P4366 题面见上面. 这题很妙,且可能是我傻,感觉这题不太好想. 前45pts很好骗就不说了. 朴素的建法是O(n^2+m)的,一个点都过不了. 然而事实上一个从x->y权值为w的边是可以被其他边取代的,我们可以把x拆成二进制,一位一位的修改最终到达y,此时经过的权值显然也是w. 也就是说,对于一个点x,我们只需要让他和x*2^k连边即可,这样就优化为O(nlo…
https://www.luogu.org/problemnew/show/P1608 题意https://www.cnblogs.com/rmy020718/p/9440588.html相似,建议还没做的先去做一下. 当你看完上一题,就已经对最短路计数大体有一个思想了,但是本题中没有说不保证没有重边和自环,那么开一个map数组记录一下就好了,自环的话我使用spfa解决的,那么我们就可以按部就班的写最短路计数了. 不过有个bug源自于spfa算法,见下图. 当你按spfa的手动模拟的时候你会发现…
https://www.luogu.org/problemnew/show/P3489 普通的最短路,不过我觉得这个复杂度按道理来说边数不应该是m*2^13吗,不知道是数据比较水还是实际上能证明复杂度低一些. 代码如下 #include<bits/stdc++.h> using namespace std; const int maxn = 210; #define pa pair<int,int> int n,m,p,k; int dis[maxn][8200]={},kn[ma…
原题入口 这道题 一道有关于最短路的图论问题. 要求从1开始求解最短路的条数. 这个题十分有趣,首先,跑裸的spfa(或者dijkstra)算出从1开始的最短路的长度. 再其次,计数的话,可以用记忆化搜索(相当于DAG dp)我们现在所遍历的路径长度要刚好是最短路的长度. (这个程序中会有体现的) 这个题我前面一直在TLE,就是没有用记忆化,暴力去找路径.(第一遍还因为没算空间MLE..TAT) 后来优化后 时间效率挺不错.(300多ms) 下面上代码: #include <bits/stdc+…
好久没写过博客了.... 本题还是挺有趣的(很水的最短路) 关键在于怎么优化这$n^2$条连边 通常,我们希望用一些边来替代一条边从而减小边集 那么,注意到异或操作可以拆分成按位运算,因此我们只需考虑$i$和每一位异或的结果连边即可 由于我们由$i$转移到$j$时,有可能中间节点$i \wedge t$是比$i$大的 因此,实际上我们应该带着$2^t$个点跑最短路,其中$2^t \geqslant n$ 然后就没什么了... #include <queue> #include <cstd…