Dijkstra 通路中最大邊

2021-09-24 08:10:48 字數 1757 閱讀 8930

題目大意:有一張無向圖,n(1<=n<=1000)個頂點,m條邊,沒有重邊。每條邊都有載重限制,求從點1到點n的一條路徑,使得載重最大,輸出該重量。

解題思路:

首先要注意這道題和網路流最大流問題的區別,初學者可能會有點暈:網路流可以由多條路徑流到匯點,但這道題只有一條路徑!單源,單路徑,那麼就用dijkstra演算法啦,只不過需要改變下鬆弛條件:以前是選取x集合外的距離最小的點加入x集合;現在是選取x集合外流量最大的點加入x集合,假設現在選取點u加入x集合,更新點v時——

d [v

]=ma

x(d[

v],m

in(d

[u],

g[u]

[v])

)d[v] = max(d[v],min(d[u],g[u][v]))

d[v]=m

ax(d

[v],

min(

d[u]

,g[u

][v]

))。 意思是首先比較到點u的流量和g[u][v],選擇小的乙個作為從u到v的流量,然後再與原來的d[v]比較,選取大的作為新的d[v]。另外要注意的是,改變了鬆弛條件,相應的,d陣列的初始化也要相應的改變,d[s]也要初始化為inf,而不是0,即初始在起點是有無限大的流量。

例:如圖所示:從s開始,比較s-a和s-b中載重量更大的哪個,選中b。再比較以b為中介是否可以使s-a的載重量變大,先取min

(d[b

],g[

b][a

])min(d[b],g[b][a])

min(d[

b],g

[b][

a])即min

(4,5

)=4min(4,5)=4

min(4,

5)=4

,再取max

(3,4

)=4max(3,4)=4

max(3,

4)=4

,故以b為中介可以使s-a的載重量變大。

#include

#include

using

namespace std;

const

int maxn =

1010

;const

int inf =

0x3ffffff

;int g[maxn]

[maxn]

;bool vis[maxn]=;

int dis[maxn]

;//從1點到該位置的最大承載量

int n, m;

intdijkstra()

}if(u ==-1

) vis[u]

=true

;for

(int i =

1; i <= n; i++)}

}return dis[n];}

intmain()

cout <<

"scenario #"

<< index++

<<

":"<< endl;

cout <<

dijkstra()

<< endl

<< endl;

}return0;

}

POJ 2253 Frogger(最大邊權最小化)

題意 給定 n nn 個點的座標 xi yi x i,y i xi y i 這 n nn 個點構成乙個無向完全圖。起點是 1 11 號,終點是 2 22 號。從起點到終點會有很多路徑,每條路徑上的邊都有乙個最大值,求這些最大值中的最小值。思路 dijkstra變形,d d d 陣列則代表從起始點到達...

連續區域的最大邊長(簡單廣搜)

題目 用 x,矩陣模擬乙個區域,用x表示物件的一部分,用 表示空間,給定矩陣後,再給定乙個x點的座標,找出這個物件的邊長,和x相連線的x都屬於這個物件,不相鄰的x 屬於另乙個物件,乙個x與左右上下,左上,左下,右上,右下的x相鄰,矩陣最大不超過20 20 include include includ...

最小生成樹的最大邊權限制下的最大生成樹

這樣陰沉的天氣持續下去,我們不免擔心起他的健康。51nod魔法學校近日開展了主題為 天氣晴朗 的魔法交流活動。n名魔法師按陣法站好,之後選取n 1條魔法鏈將所有魔法師的魔力連線起來,形成乙個魔法陣。魔法鏈是做法成功與否的關鍵。每一條魔法鏈都有乙個魔力值v,魔法最終的效果取決於陣中所有魔法鏈的魔力值的...