題目大意:懶漢需要從a城市開車到b城市去見乙個朋友,他的汽車的郵箱的容積l公升,車每行駛1公里就要消耗1公升油。途中只有在到達乙個城市之後才可以找的到加油站並加油,而且懶漢的車很特殊,每次加油只能加滿整個郵箱。
懶漢希望途中加油的次數越少越好,當加油的次數相同時,他希望加油所花的錢數越少越好。現在懶漢把地圖告訴了你,你能幫幫他嗎?可以認為懶漢出發的時候油箱是滿的,如果到達 b城市時油箱不是滿的,也無需再加油。
假定各地加油站的汽油**均為y元/公升,如果懶漢想從x城市沿長為z公里的路開車到達y城市,那麼離開x城市時汽車至少應還有z公升汽油。
input
輸入包含若干組資料,每組資料的第一行有四個正整數n(1<=n<=100),m(1<=m<=1000),l(1<=l<=100),y(1<=y<=100),其中n表示地圖上一共有n個城市,標號分別為1,2,…,n,m表示n個城市間一共有m條路,l和y的含義同上。
接下來一行有兩個正整數s(1<=s<=n),t(1<=t<=n),分別表示a城市和b城市的標號。
接下來一共有m行,每行有三個正整數x(1<=x<=n),y(1<=y<=n),z(1<=z<=100),表示標號為x的城市和標號為y的城市之間有一條長為z公里的雙向道路。
資料組數不超過100組,讀入以eof結束。
output
對於每組資料,用一行輸出乙個整數,表示在加油次數最少的前提下,加油所花的最少的錢數。
如果懶漢不能開車到達b城市,輸出-1即可。
sample input
4 4 6 1
1 41 2 3
2 4 4
1 3 2
3 4 6
sample output
2思路:很明顯要用到優先佇列+bfs。(1)加油次數小的放在前面。(2)總花費少的放在前面。(3)剩餘油量多的放在前面。關鍵是這題對於乙個非終結狀態的最優判定是模糊的,比如說在同乙個點i
ii,現在有三個狀態:(1)加油次數2
22,花費120
12012
0,剩餘油量0
00;(2)加油次數3
33,花費160
16016
0;剩餘油量50
5050
;(3)加油次數3
33,花費200
20020
0,剩餘油量100
10010
0。設點i
ii距離終點的距離為100
10010
0公里,油價為1
11元每公里,那麼最優解其實是(3),次優解是(2),最差的解是(3)。是不是和自己預想的有些出入?因此這題對狀態的篩選要寬鬆一點,只要加油次數、總花費、油量任意乙個屬性可更新,就應該把該狀態放進佇列中。
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using
namespace std;
typedef
long
long ll;
struct edge
edge[
2005];
int n,m,s,t,l,y,tot;
int head[
105]
;struct node
node
(int ii,
int ss,
int vv,
int ll=l)
bool
operator
<
(const node &a)
const
}vis[
105]
;void
addedge
(int u,
int v,
int dis)
void
bfs(
)for
(int i=head[t1.id]
;i;i=edge[i]
.nxt)
}printf
("-1\n");
}int
main()
bfs();
}return0;
}
1232 買不到的數目 DP 數學
時間限制 1 sec 記憶體限制 128 mb 提交 21 解決 10 統計 小明開了一家糖果店。他別出心裁 把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。你可以用計算機測試一下,在這種包裝情...
懶漢模式的常規使用
設計模式之單例模式 這裡不做模式的分析討論,僅針對使用過的用法進行演示。最早使用的方法 h include classa return self 返回唯一例項s private static std mutex m mutex static a self cpp 初始化靜態變數 std mutex ...
CSU 1115 最短的名字
description 在乙個奇怪的村子中,很多人的名字都很長,比如aaaaa,bbb and abababab。名字這麼長,叫全名顯然起來很不方便。所以村民之間一般只叫名字的字首。比如叫 aaaaa 的時候可以只叫 aaa 因為沒有第二個人名字的前三個字母是 aaa 不過你不能叫 a 因為有兩個人...