題目大意:有一張無向圖,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,魔法最終的效果取決於陣中所有魔法鏈的魔力值的...