随笔分类 - 图论-最短路
摘要:"题目链接" Solution 发现 $n$ 只有 $50$, 可以用 $floyd$ . 然后 $w[i][j][l]$ 代表 $i$ 到 $j$ 是否存在 $2^l$ 长的路. 四重循环,枚举即可.如果有则更新 $dis[i][j]$ 为 $1$ . 然后再跑 $floyd$ 即可. 不过注意枚
阅读全文
摘要:"题目链接" Solution 水水的套路题。 可以考虑到一个环内的点是可以都到达的,所以 $tajan$ 求出一个 $DAG$ 。 然后 $DAG$ 上的点权值就是 $scc$ 的大小。 对于那条可以反的边,直接建两层图就好了。 最后跑最长路,第一个节点的 $scc$ 在第二张图上的对应节点的答案
阅读全文
摘要:"题目链接" Solution 我只会60分暴力... 正解是 DP. 状态定义 : $f[i][j]$ 代表 $1$ 到 $i$ 比最短路长 $j$ 的方案数. 那么很显然最后答案也就是 $\sum^{i=0}_{k}f[n][i]$. 转移方程 : 对于任一状态 $f[i][j]$ 我们对可以到
阅读全文
摘要:"题目链接" Solution 裸题诶... 直接 $Tarjan$ 缩点+ $SPFA$ 最长路即可. 不过在洛谷上莫名被卡... RE两个点... Code cpp include define ll long long using namespace std; const int maxn=2
阅读全文
摘要:"题目链接" Solution 分块+$Dijkstra$. 难点在于建边,很明显 $O(n^2)$ 建边会挂一堆 . 那么考虑一下, $n^2$ 建边多余的是哪些东西 $???$ 很显然是冗杂的边,即两个点在之前已经可以互达了,但是在这一次仍然又连接一遍. 所以我们对于 $n$ 个点 都开 $sq
阅读全文
摘要:"题目链接" Solution 1. 非正解 似乎比较蛇啊,先个一个部分分做法,最短路+$DP$. 在求最短路的堆或者队列中存储元素 $dis_{i,j}$ 代表 $i$ 这个节点,走了 $j$ 条边的距离. 然后跑堆优化 $Dijkstra$ 或者 SPFA 即可. 复杂度 $O(N nlog(n
阅读全文
摘要:"题目链接" Solution 在最短路转移的时候在队列或者堆中记录状态为 $f[u][v]$ 代表上一个节点为 $u$ ,速度为 $v$ . 然后按部就班转移即可... Code cpp include define ff double using namespace std; struct sj
阅读全文
摘要:"题目链接" Solution 建立 $k+1$ 层图跑 $Dijkstra$ 就好了. Code cpp include define ll long long using namespace std; const int maxn=200008; int n,m,k,s,t; struct sj
阅读全文
摘要:"题目链接" Solution 分层图+$SPFA$。 建立3层图,其中每一层之中的边权赋为0. 对于任意一条边 $t$ ,其起点 $x$ 和终点 $y$. 我们将 $x$ 在第一层的节点连向 $y$ 的第二层节点,边权为 $w[x]$. 代表在 $x$ 买了这个东西. 然后将 $x$ 在第二层的节
阅读全文
摘要:"题目链接" Solution 好题. 一开始一直在想怎么蛇皮建图,但是发现一直蛇不出来... 正解是用类似于 dijkstra 的算法对所有点进行松弛. 对于每个元素记录两个值: $cost$ 代表它的最小花费. $ans$ 代表它的方案数. 同时用一个$f_{i,j}$记录第$i$种和第$j$种
阅读全文
摘要:"题目链接" Solution 这道题算是很经典的状压问题了,好题. 考虑到 $n$ 的范围仅为 $10$ , 那么也就是说所有状态压起来也只有 $1024$ 种情况. 然后我们发现 $m$ 居然小于 $100$ . 于是可以 $O(nm)$ 处理出每一种情况可以到达的结果. 然后形成一个有向图,然
阅读全文

浙公网安备 33010602011771号