【題目鏈結】
【解題報告】
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...