題意:
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,...