在郊區有 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因為我們要找的是把k跳邊去掉之後,這條路徑剩下的最大的一條邊。
那麼我們直接二分答案尋找這條邊的值,如果某條邊的權值大於我們假設的權值,那麼我們就直接把這條邊的權值設為1,否則設為0。那麼我們就得到了權值只有0或1的圖。如果我們找到的最短路徑》k 就說明我們假設的這個答案太小了,我們需要增大答案的值,反之則說明我們假設的答案小於等於正確答案。
#include
using namespace std;
typedef
long
long ll;
typedef pair<
int,
int> pii;
typedef
unsigned
long
long ull;
const
int n=
1e3+7;
const
int m=
2e4+7;
const
int inf=
0x3f3f3f3f
;int n,m,k;
int h[n]
,e[m]
,ne[m]
,w[m]
,idx,cc[m]
;int d[n]
;bool st[n]
;void
add(
int a,
int b,
int c)
intspfa()
}}}return d[n];}
bool judge
(int x)
}int num=
spfa()
;if(num<=k)
return true;
else
return false;
}int
main()
int l=
0,r=
1000001
;int ans=-1
;while
(lelse
} cout
}
AcWing 340 通訊線路
在郊區有 n 座通訊基站,p 條 雙向 電纜,第 i 條電纜連線基站ai和bi。特別地,1 號基站是通訊公司的總站,n 號基站位於一座農場中。現在,農場主希望對通訊線路進行公升級,其中公升級第 i 條電纜需要花費li。公司正在舉行優惠活動。農產主可以指定一條從 1 號基站到 n 號基站的路徑,並指定...
雙端佇列 二分 通訊線路
在郊區有 n 座通訊基站,p 條 雙向 電纜,第 i 條電纜連線基站ai和bi。特別地,1 號基站是通訊公司的總站,n 號基站位於一座農場中。現在,農場主希望對通訊線路進行公升級,其中公升級第 i 條電纜需要花費li。公司正在舉行優惠活動。農產主可以指定一條從 1 號基站到 n 號基站的路徑,並指定...
COGS T 7 通訊線路
輸入檔案 mcst.in輸出檔案 mcst.out簡單對比 時間限制 1.5 s 記憶體限制 128 mb 問題描述 假設要在n個城市之間建立通訊聯絡網,則連通n個城市只需要n 1條線路。這時,如何在最少經費的前提下建立這個通訊網。在每兩個城市之間都可以設定 條線路,相應地都要付出一定的經濟代價。n...