1. 程式人生 > >SPFA小總結

SPFA小總結

沒有 gen 插入 稀疏圖 最大流 center 考試題 堆優化 由於

關於spfa

知識點

原始版 ---裸

應用:

一、判負環

兩種方法

1.跑單源點,如果某一個點入隊了n-1次,存在

2.對於每個點spfa,如果此源點反被其他點更新,存在

證明:點i作為源點,d[i]==0 若i被更新,d[i]<0 定存在負環

二、網絡流最小費用最大流

無限spfa直到沒有可流的量

在原始spfa中,加入流量限制 ,記錄入邊

每次spfa結束後沿入邊更新流量即可

三、差分約束

建圖更復雜,建好圖就很水了

優化:

SLF

雙向隊列優化 若d[v]<d[head] 插入隊首 否則隊尾

堆優化:手寫小頂堆或者STL優先隊列

優點

跑稀疏圖較快且可以跑負邊權

復雜度 O(E*K) K為常數且大致為1~2

題目分析:

Spfa其實很簡單啊,只是建模比較麻煩了

1.首先今上午的考試題,spfa中加一個dp,存到現在點用了幾個血包,但由於惡心的出題人卡了你一下,你需要一個SLF優化或者轉成dijkstra

知識點:dp+優化

2.某個題目吧,大致是一個n*m的方格圖,只能沿著邊走,問從一個坐標到另一個坐標最少需要轉幾次彎。 拆點,每個格點拆為上下左右四個點,表示向哪個方向走,想到拆點之後建邊就很簡單了

知識點:拆點

3.一道很裸的判負環的題,方法上面又講,代碼也很簡單

知識點:判負環

4.分層spfa,有一些層次,每個層次只能向下一層次建邊

知識點:建模

大概見過的題目好像就只有這些了。。。

考得多的其實是拆點和建邊吧

(完)

SPFA小總結