1.要时刻有建反图进行尝试的思想
2.求u -> v路径上最大/最小边权,两种办法
1.二分答案 + dijkstra验证
2.kruscal求最小生成树,每次 升序/降序 连边之后用并查集判断是否连通
3.判断负环,spfa可以判断负环,用cnt记录路径上每个点出现的次序,具体来说cnt[v] = cnt[u] + 1(其中u -> v),当出现一个点次序大于n的时候说明图中存在负环
4.如果出现多个可能起点的时候不妨考虑增添虚拟源点
5.差分约束
6.903. 昂贵的聘礼 - AcWing题库
难点在于等级的限制,其中1号点一定经过,因此我们就枚举等级区间,每次dijkstra只考虑在该区间的点,从[lev1 - m , lev1],[lev - m + 1 , lev1 + 1] ..........[lev , lev + m]枚举每个区间作为限制即可
7.4265. 0或1 - AcWing题库
思维难题,当出现01矩阵的时候可以往邻接矩阵的方向去想,例如本题若是我们将c看作一个邻接矩阵那么
- X12+X13+…+X1n=1X12+X13+…+X1n=1。
- X1n+X2n+…Xn−1n=1X1n+X2n+…Xn−1n=1。
- 对于每个 ii(1<i<n1<i<n),满足 ∑Xki(1≤k≤n)=∑Xij(1≤j≤n)∑Xki(1≤k≤n)=∑Xij(1≤j≤n)。
前两个条件表达的意思就是点1出度为1,点n入度为1,第三个的意思则是若i点入度 + 1则出度 +1那么我们就可以发现问题转换成一个最短路问题,边权就是aij
本体有一个坑点就是满足题意的有两种情况一种是从1到n的一条路径
还有一种就是我们发现条件虽然规定了1的出度和n的入度但是没有规定1的入度和n的出度,那么也就是说从1出发不经过n点的环 + n点出发不经过1点的环也符合题意
那么如何利用最短路算法求环呢,当我们要求包含s点的环的时候我们以s点为起点跑dijkstra当s点的邻边全部松弛完毕的时候我们将s点的dist和st进行初始化,最后得到的dist[s]就是包含s的最小环了
8.差分约束
差分约束是用来解决不等式组的一个算法,通过将不等式组转换成图上的问题来进行求值
xi - xj <= w这个不等式通过移项变成xi <= xj + w,我们发现再最短路算法中每次进行松弛操作的时候dist[u] > dist[v] + w的时候我们要令dist[u] = dist[v] + w从而达到dist[u] <= dist[v] + w的状态,而这个式子和上述不等式的形式是一样的,所以我们可以从j点向i点连一条边权为w的边,最后在整张图上跑最短路即可因为存在负边权所以得用spfa,若图中出现负环则说明无解。



















