在郊區有 n 座通訊基站,p 條 雙向 電纜,第 i 條電纜連線基站ai和bi。
特別地,1 號基站是通訊公司的總站,n 號基站位於一座農場中。
現在,農場主希望對通訊線路進行公升級,其中公升級第 i 條電纜需要花費li。
**公司正在舉行優惠活動。
農產主可以指定一條從 1 號基站到 n 號基站的路徑,並指定路徑上不超過 k 條電纜,由**公司免費提供公升級服務。
農場主只需要支付在該路徑上剩餘的電纜中,公升級**最貴的那條電纜的花費即可。
求至少用多少錢可以完成公升級。
輸入格式
第1行:三個整數n,p,k。
第2…p+1行:第 i+1 行包含三個整數ai,bi,li。
輸出格式
包含乙個整數表示最少花費。
若1號基站與n號基站之間不存在路徑,則輸出」-1」。
資料範圍
0≤k思路解析
首先我們一眼就可以確定這道題目是的最短路演算法.畢竟題目上白紙黑字上寫著要,求出最短路.
首先我們一步步分析一下,這道題目的幾個關鍵點.
這道題目的路徑代價是什麼?
我們發現,這裡的路徑不同於一般的最短路,每一條路徑的最大邊是這條路徑的花費
題目中有些路徑可以清零,這怎麼辦?
這道題目中,有些邊可以代價為0,那麼我們不妨設定一種特殊邊.
比如說(a,b)(a,b)是相連的邊,他們代價是c,那麼如果說我們讓它免費,不就是又多了一條邊,(a,b)(a,b),只不過他們的代價是0?
所謂的路徑可以免費,就是多了一條為0的重邊.
所以這道題目的性質,轉換一下就是,我們可以設定k條為權值0的邊.
所以我們可以設定乙個陣列d[x,p]d[x,p]表示從1號節點到x號節點,途中經過p條權值為0的邊,
1.新加入的邊是非0邊.
那麼我們面對每一條新加入的邊(x,y,z),我們的d[y,p]=max(d[x,p],z),其中z為(x,y)權值.
2.新加入的邊是0邊.
如果新加入的邊是權值為0的邊,顯然是d[y,p+1]=d[x,p].
#includeusing namespace std;
const int n=5e4+10,m=1e3+10;
int n,m,k;
int e[n],ne[n],idx,w[n],h[n];
void add(int a,int b,int c)
int dist[m][m],st[m];
void spfa()
for(int p=1;p<=k;p++)
} } }}
int main()
spfa();
int res=0x3f3f3f3f;
for(int i=0;i<=k;i++) res=min(res,dist[n][i]);
if(res==0x3f3f3f3f) cout<<-1;
else cout
}
通道安全 SPFA
輸入 第一行 t 表示以下有 t 組測試資料 1 t 8 對每組測試資料 第一行 n m 分別表示網路中的節點數和通道數 1 n 10000,1 m 50000 接下來有 m 行,每行包含三個整數 i,j,p,表示節點 i 與節點 j 之間有一條通道,其信 道安全可靠性的概率為 p 1 i,j n ...
SPFA 重建道路(jzoj 1212)
有乙個圖,其中的一些路壞了,為了從a走到b,問最少修復多長的路 3 21 2 1 2 3 2 11 2 1 312 n 100 2 leqslant n leqslant 100 2 n 100n 1 d m n n 1 2n 1 leqslant d leqslant m leqslant n n...
bzoj3575 最短路 SPFA 道路堵塞
description a國有n座城市,依次標為1到n。同時,在這n座城市間有m條單向道路,每條道路的長度是乙個正整數。現在,a國 交通部指定了一條從城市1到城市n的路徑,並且保證這條路徑的長度是所有從城市1到城市n的路徑中最短的。不幸 的是,因為從城市1到城市n旅行的人越來越多,這條由交通部指定的...