HDU 1572 下沙小麵的 2 解題報告

2021-07-23 10:12:03 字數 1496 閱讀 6768

description

前文再續,書接上一題。話說當上小麵的司機的lele在施行他的那一套拉客法則以後,由於走的路線太長,油費又貴,不久便虧本了。(真可憐~)於是他又想了乙個拉客的辦法。 

對於每一次拉客活動,他一次性把乘客都拉上車(當然也不會超過7個,因為位置只有7個)。然後,lele計算出一條路線(出於某些目的,lele只把車上乘客的目的地作為這條路線上的站點),把所有乘客都送到目的地(在這路線上不拉上其他乘客),並且使總路線長度最短。 

不過lele每次都要花很多時間來想路線,你能寫個程式幫他嘛?

input

本題目包含多組測試。最後一組測試後有乙個0代表結束。 

每組測試第一行有乙個整數ncity(3<=ncity<=30)表示下沙一共有多少個站點(站點從0開始標號)。 

然後給你乙個 ncity * ncity 的矩陣,表示站點間的兩兩距離。即這個矩陣中第 i 行 第 j 列的元素表示站點 i 和站點 j 的距離。(0<=距離<=1000) 

再然後有乙個整數k(1<=k<=7),表示lele拉上車的人數。 

接下來的一行裡包括 k 個整數,代表上車的人分別要去的站點。(0《站點output

對於每一組測試,在一行內輸出乙個整數,表示最短路線的長度。

sample input

3

0 1 2

1 0 3

2 3 0

31 1 2

0

sample output

4

標準的方案應該是當做最短路問題來解決,但是這道資料量很小,完全可以用dfs或者bfs搜尋暴力解決。

題目中指出,只會將乘客目的地作為路線中的站點。因此,排除了某種情況下,繞路走乙個不是目的地的位置反而更省距離的可能。換句話說,只可能從出發點去往某個目的地,或者從某個目的地去往另乙個目的地。這道題求得最短距離是路徑的權值和,而不是搜尋過程中的層數或者步數之類的東西,因此不要在找到第乙個可行方案後就完成搜尋(結束迴圈),第乙個可行方案意味著步數最少,但不意味著是這道題中的最短路徑。甚至,這道題中的每乙個可行方案的步數都是相同的。既然如此,使用bfs或者dfs便沒有什麼區別了,自然考慮實現起來更簡便的dfs演算法。

暴力搜尋,每種方案都是搜夠所有的目標點為止,取距離(路徑權值和)最小的方案。

#include #include using namespace std;

int cnt,ans,n,k;

int vis[30],map[30][30],mask[30],stop[30];

int dfs(int num,int now,int d)

for(int i=0;i

以下為原本寫的bfs求解方案。顯然不如dfs簡潔。

#include #include#include#includeusing namespace std;

int main() t;

queueq;

memset(wanted,0,sizeof(wanted));

for(int i=0;i

HDU 1572 下沙小麵的 2 DFS

前文再續,書接上一題。話說當上小麵的司機的lele在施行他的那一套拉客法則以後,由於走的路線太長,油費又貴,不久便虧本了。真可憐 於是他又想了乙個拉客的辦法。對於每一次拉客活動,他一次性把乘客都拉上車 當然也不會超過7個,因為位置只有7個 然後,lele計算出一條路線 出於某些目的,lele只把車上...

搜尋 下沙小麵的2(hdu1572)

題目描述 話說當上小麵的司機的lele在施行他的那一套拉客法則以後,由於走的路線太長,油費又貴,不久便虧本了。真可憐 於是他又想了乙個拉客的辦法。對於每一次拉客活動,他一次性把乘客都拉上車 當然也不會超過7個,因為位置只有7個 然後,lele計算出一條路線 出於某些目的,lele只把車上乘客的目的地...

HDOJ 1572 下沙小麵的 2

乙個小黑車,最多裝7個人,送往每個人要去的站點,並且中途只能在這些人的目的站點停車 然後給你乙個 ncity ncity 的矩陣,表示站點間的兩兩距離。即這個矩陣中第 i 行 第 j 列的元素表示站點 i 和站點 j 的距離。0 距離 1000 再然後有乙個整數k 1 k 7 表示lele拉上車的人...