UVa 10603 BFS 優先佇列

2021-07-09 06:27:34 字數 982 閱讀 1846

【題目鏈結】

【解題報告】

lrj紫書中路徑尋找問題的例題。大部分細節書中都有說明,不再贅述。說一點自己的感想。

書裡面說演算法的正確性不是顯然的,可是我覺得應該是顯然的吧?

每次找到佇列裡dist值最小的狀態,以它來更新ans值,並且拓展其他狀態。

假如當前我們找到了乙個恰好有某個瓶子裡的水為d公升的狀態p,現在我們把它push進佇列。有兩種情況:

1.p在佇列首,說明它是dist值最小的狀態,可以直接取出,然後結束搜尋。

2.p在佇列中。那麼p後面的所有狀態都可以砍去,因為無論如何都不會比

p狀態更優。p前面的節點會優先被拓展,那麼拓展之後比p更優的狀態還會在p前面。所以如果p不是最優解,p一定不會被取出,反之,我們取出的第乙個滿足某個v[i]=d的狀態一定是最優解。

不知道這樣想有沒有漏洞。如果有的話還請不吝指出。

【參考**】

/*

這個題可以學到幾個技巧:

1.struct狀態的整體賦值

2.如何標記vis值(這裡挺巧妙的)

3.在能夠得到的答案裡,如何找到最接近d的值

4.在優先佇列裡,最好在取出節點的時候更新答案

*/#include

#include

#include

#include

using

namespace

std;

int cap[3];

struct state

};int ans[210];

int vis[ 210 ][210];

void update( const state& u )

}void solve( int a, int b, int c, int d )}}

while( d>=0 )

d--;

}}int main()

return

0;}

uva 10603 BFS 優先佇列

先吐槽下這兩天無限卡題,已經積了3道了。一籌莫展,只能先開一道稍微簡單點的。題意 這題就是加強版的倒水問題,把三個杯子分別含水量作為狀態,已經倒水的值作為距離。構建隱式圖,然後利用優先佇列寬搜其中記得時刻更新到達終點的最小距離。因為有可能無法到達目標狀態需要輸出離目標最近的。其實狀態還可進一步簡化,...

紫書uva 10603 優先佇列 bfs

這個題目其實是暴力的乙個典範,首先題目說了是最小倒水數,也就是總共次數中轉移水的數量,bfs是找最小次數的,因此要用優先佇列來改變優先順序,將最小倒水數優先,然後是處理如果找不到合適的d,我們要把所有能夠找到的值都存放在乙個陣列裡面,然後遍歷一次就可以了,我用的vis陣列是三維的,用來表示第1,2,...

Fill BFS 優先佇列 UVA10603

uva 10603 include include include using namespace std struct node friend bool operator node a,node b int a,b,c,d int vis 205 205 b杯和c杯的容量表示一種狀態 int re...