通訊道路 spfa應用

2021-10-24 09:33:12 字數 1496 閱讀 5815

在郊區有 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旅行的人越來越多,這條由交通部指定的...