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

2021-10-02 14:27:48 字數 1833 閱讀 3184

題意:給定 n

nn 個點的座標 (xi

,yi)

(x_i,y_i)

(xi​,y

i​),這 n

nn 個點構成乙個無向完全圖。起點是 1

11 號,終點是 2

22 號。從起點到終點會有很多路徑,每條路徑上的邊都有乙個最大值,求這些最大值中的最小值。

思路:dijkstra變形,d

d[\ ]

d 陣列則代表從起始點到達當前點的路徑裡最大邊權的最小值。

首先初始化 d[s

]=0d[s]=0

d[s]=0

,其餘的 d

d[\ ]

d 均初始化為 inf。

每次找到未訪問結點中 d

d[\ ]

d 最小的結點 u

uu,再以 u

uu 為中介點對 u

uu 可達的節點進行優化。

假設有路徑 u→v

u \rightarrow v

u→v,承重為 w

ww,可以發現:

如果選擇了該路徑並且該路徑上的最大邊權 max

(d[u

],w)

max(d[u] , w)

max(d[

u],w

) 比 d[v

]d[v]

d[v]

還小,那麼 d[v

]=ma

x(d[

u],w

)d[v] = max(d[u],w)

d[v]=m

ax(d

[u],

w)。(最大相對於該路徑內部而言,最小相對於全域性而言)

#include

#include

#include

#include

#include

using

namespace std;

const

int inf =

0x3f3f3f3f

;const

int n =

210;

struct node a[n]

;int n;

double g[n]

[n];

double d[n]

;bool vis[n]

;double

get(

int i,

int j)

void

dijkstra()

d[1]

=0;for

(int i =

0; i < n;

++i)}if

(u ==-1

)return;

vis[u]

=true

;for

(int v =

1; v <= n;

++v)

// 用u去更新其他點if(

!vis[v]

&&max

(d[u]

, g[u]

[v])

< d[v]

) d[v]

=max

(d[u]

, g[u]

[v]);}

}int

main()

return0;

}

POJ 2253 Frogger 最短路小變形

傳送門 參考 題意 給出乙個無向圖,求一條從 1 到 2 的路徑,使得路徑上的最大邊權最小 思路 dij將距離更新改成取最大值即可,即dis i 表示到達i點過程中的最大邊權,更新後可能多個,再靠優先佇列取出最小的最大邊權。include include include include includ...

2253 Frogger 解題報告

accecpttime 2008 12 30 11 11 23 language c memory 572k time 16ms errors 2wa algorithm dijkstra最短路徑 include include include include include using names...

POJ 2253(floyd 條件改變)

poj 2253 題意 有很多座標,求點一到點二的每個通路之中最長的距離,輸出最長的距離之中最短的那個。這道題無關最短路,利用floyd的遍歷,但是關鍵在於條件。include include includeusing namespace std double path 210 210 class ...