先吐槽下這兩天無限卡題,已經積了3道了。一籌莫展,只能先開一道稍微簡單點的。
題意:這題就是加強版的倒水問題,把三個杯子分別含水量作為狀態,已經倒水的值作為距離。構建隱式圖,然後利用優先佇列寬搜其中記得時刻更新到達終點的最小距離。因為有可能無法到達目標狀態需要輸出離目標最近的。其實狀態還可進一步簡化,由於總的水量是一定的,所以只要記錄兩個杯子的含水量就可推出第三個。我這裡沒有簡化,**也寫得比較長。。。terrible。不過至少1a了
**如下:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10view code#define mp(a, b) make_pair(a, b)
11#define pb(a) push_back(a)
1213
using
namespace
std;
1415 typedef long
long
ll;16 typedef pairpii;
17 typedef pairint, unsigned int>puu;
18 typedef pairpid;
19 typedef pairint>pli;
2021
const
int inf = 0x3f3f3f3f;22
const
double eps = 1e-6;23
const
int len = 201;24
25struct s;
26 typedef pairpis;
27int
ed, dis[len][len][len];
28bool
vis[len][len][len];
29s st;
3031 inline void setd(s &vex, int val)
32 inline int getd(s vex)
33 inline void svis(s vex)
34 inline bool isvis(s vex)
35 inline int cv(int val)
36struct
c***7
39};
4041
//將水從a倒到b中
42 s pour(s vex, int a, int b, int &val)
43else
52 val =min(water, rest);
53return
vex;54}
5556
57void
bfs(s s)
5873
if(min(cv(ed-nv.a[0]), min(cv(ed-nv.a[1]),cv(ed-nv.a[2])))
77for(int i=0; i<3; i++)
78for(int j=0; j<3; j++)86}
87}88 printf("
%d %d\n
", dis[mp[0]][mp[1]][mp[2]], ed-mindip);89}
9091
intmain()
92);
101}
102return0;
103 }
UVa 10603 BFS 優先佇列
題目鏈結 解題報告 lrj紫書中路徑尋找問題的例題。大部分細節書中都有說明,不再贅述。說一點自己的感想。書裡面說演算法的正確性不是顯然的,可是我覺得應該是顯然的吧?每次找到佇列裡dist值最小的狀態,以它來更新ans值,並且拓展其他狀態。假如當前我們找到了乙個恰好有某個瓶子裡的水為d公升的狀態p,現...
紫書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...