CSU1232 懶漢的旅行 bfs 優先佇列

2021-09-27 09:57:38 字數 2194 閱讀 6458

題目大意:懶漢需要從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 因為有兩個人...