最短路徑中的反向建邊

2021-10-04 15:35:40 字數 799 閱讀 2046

我們很容易理解並且處理單源最短路,從某點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 現在要求...