uva 10603 BFS 優先佇列

2022-07-10 05:24:14 字數 1710 閱讀 9128

先吐槽下這兩天無限卡題,已經積了3道了。一籌莫展,只能先開一道稍微簡單點的。

題意:這題就是加強版的倒水問題,把三個杯子分別含水量作為狀態,已經倒水的值作為距離。構建隱式圖,然後利用優先佇列寬搜其中記得時刻更新到達終點的最小距離。因為有可能無法到達目標狀態需要輸出離目標最近的。其實狀態還可進一步簡化,由於總的水量是一定的,所以只要記錄兩個杯子的含水量就可推出第三個。我這裡沒有簡化,**也寫得比較長。。。terrible。不過至少1a了

**如下:

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10

#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 }

view code

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...