最短路徑樹 刪邊

2021-10-11 15:26:22 字數 1599 閱讀 5484

題意:

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

)。現在要求刪除一條邊後,使得新的dis值dis』最大。其中不連通的兩點的最短路長度為l

ll(注意有重邊)

思路:先求出以每個點為源點的最短路徑樹,再列舉刪除每條邊後,判斷對每個源點的最短路徑樹有沒有影響(該邊在不在樹上),若在,需刪除該邊,重新跑spfa,若不在直接加上最開始跑的最短路徑樹權值即可。spfa恰好可以解決重邊的問題。

重點:鏈式存邊,可以直接用k,遍歷邊 || 好像只有我不會

#include

using

namespace std;

const

int maxn=

250;

typedef

long

long ll;

const ll inf=

1e10

;ll to[maxn*10]

,w[maxn*10]

,head[maxn*10]

,nex[maxn*10]

,k=1

,l,pre[maxn]

,mp[

105]

[105

],vis[maxn]

,is[

101]

[2001

],dis[maxn]

,sdis[maxn]

,ans1,ans2;

int n,m;

struct node};

void

add(

int a,

int b,ll c)

ll spfa

(int st,

int del));

dis[st]=0

; vis[st]=1

;while

(!p.

empty()

)),vis[y]=1

;}}}

ll sum=0;

for(

int i=

1;i<=n;i++

)return sum;

}int

main()

for(

int i=

1;i<=n;i++

)for

(int i=

2;i<=k;i+=2

) ans2=

max(ans2,tmp);}

printf

("%lld %lld\n"

,ans1,ans2);}

}

第n次因為陣列開小了,卡了乙個多小時,艹

瑪麗卡(spfa刪邊求最短路)

題目描述 麥克找了個新女朋友,瑪麗卡對他非常惱火並伺機報復。因為她和他們不住在同乙個城市,因此她開始準備她的長途旅行。在這個國家中每兩個城市之間最多只有一條路相通,並且我們知道從乙個城市到另乙個城市路上所需花費的時間。麥克在車中無意中聽到有一條路正在維修,並且那兒正堵車,但沒聽清楚到底是哪一條路。無...

最短路徑樹

問題描述 所謂最短路徑樹,就是從s出發,沿著樹上的邊走到任意點i,那麼經過的這些邊的權值和就是s到i的最短路徑。dijkstra演算法或spfa演算法不僅可計算從起點s到各點的最短路徑長度,同時也可得到以s為根的最短路徑樹。方法是在進行鬆弛操作時,如果d i c d j 時,除了更新d j 之外,還...

無權邊單源最短路徑

無權邊單源最短路徑相對來說比較簡單,邊數就是路徑長度。從出發點開始,先收集路徑為0頂點 它本身 然後收錄他的鄰頂點 路徑為1 再依次收錄長度為2,3,4.整個過程其實就是乙個廣度優先搜尋 bfs 但是需要做些改變,需要乙個陣列d w 來記錄頂點w到源點s的路徑長度,開始時要將d w 初始化 為 1,...