我們很容易理解並且處理單源最短路,從某點a出發,到達終點b的最短路徑,為了到達終點,我們不可避免的就需要經過每乙個點(鬆弛操作),那麼如果由多個終點到達某乙個點,那麼我們需要把很多次dijkstra或者spfa嗎,或者說直接來乙個floyd(前提是點數很少,畢竟o(n^3)),那麼我們就可以反向建邊來很快的解決這個問題.
通過反向建邊,我們只需要跑兩次單源最短路,即可得到起點到終點的最短路和終點到起點的最短路,是不是十分的(可來往)clever呢
傳送門1
傳送門2
#includeusing namespace std;
#define ll long long
const int n = 5e6+5;
ll n,m,s = 1,cnt,head[n],dis[n],ans,rhead[n],rdis[n];
struct edgee[n],re[n];
struct node
bool operator < (const node&rhs) const
};void addedge(ll u,ll v,ll w)
void dijkstra()
} }}void rdijkstra()
} }}int main()
for(ll i=1; i<=m; i++)
dijkstra();
rdijkstra();
for(ll i=1; i<=n; i++)
cout << ans << endl;
return 0;
}
最短路(SPFA 反向建邊)
題目描述 給定乙個 nnn 點 mmm 邊的有向帶權圖表示一座城市,起點為 111 送餐小哥需要給 nnn 個客戶送外賣,第 iii 個客戶的家在第 iii 號點。由於他的車子容量很小,所以一次只能容納乙份外賣,所以送達外賣之後就要回到起點取新的外賣送下一單,直到全部送到位置。有向圖保證聯通。外賣小...
POJ3268 最短路徑 反向存邊
因為是單向邊,牛兒來回的路徑長度並不相同,所以需要用兩次dijkstra,一次正向從x開始dijkstra,再將邊全部反向存再來一次。因為是板子題比較良心n比較小,我們就可以用矩陣來儲存啦。如果n比較大的話,我的想法是再造乙個圖,同時反向存邊。記憶體可能占用比較大但是想起來簡單。很短。include...
最短路徑樹 刪邊
題意 n nn 個點,m mm條邊的無向圖,令dis disdi s為每對結點的最短路長度的和。例如n 2 n 2n 2時,dis d 1 1 d 1,2 d 2,1 d 2,2 dis d 1,1 d 1,2 d 2,1 d 2,2 dis d 1,1 d 1 2 d 2,1 d 2,2 現在要求...