uva11882 最大的數 bfs 遍歷估價剪枝

2021-07-16 04:56:01 字數 1749 閱讀 8942

剪枝:利用bfs低複雜度遍歷估價和最優解比較,剪枝後避免列舉子集造成的高複雜度時間浪費。

利用多次排序從大數開始遍歷,或者利用優先佇列。

dfs+bfs剪枝。

****於網路,易於理解但無法直接ac。

#define _crt_secure_no_warnings   

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct node

};

int cnt;

int n, m, maxd;//maxd表示答案的長度

#define n 35

#define for(i,n) for(int i=0;i<(n);i++)

int b[n], c[n];//b陣列存放答案,c陣列是當前待嘗試的結果

int vis[n][n];

int a[n][n];//存放輸入的數字,'#'均用0表示

const

int dx = ;

const

int dy = ;

int find(int x, int y)//尋找(x,y)後面最多還有多少個數

return ret;

} bool dfs(int cur, int val, int x, int y, bool same)//當前位置為cur,待填入的值為val,座標為(x,y),same表示cur之前的數字和目前的答案是否完全一致,返回是否更新過答案

int res = maxd - cur; cnt++;//res表示還需要找的數字個數,cnt表示查詢的次數,也作為標記數

if (find(x, y) < res)return

0;//如果剩餘的數字個數《需要的數字個數,剪枝(2)

vector

l;

for(k, 4));//後繼結點都放入l中

} sort(l.begin(), l.end());//排序,從較大的後繼結點開始搜尋

bool o = 0;

for(i, l.size())

return o;

} char st[100];

void solve()

);

maxd++;

} }

} sort(l.begin(), l.end());//將數值較大的結點放到前面

for (; maxd >= 1; maxd--)//從長度最大的開始嘗試,如果無解,換為小一點的,這樣的乙個好處是容易比較大小,可以進行剪枝

if (o)break;//當前答案長度的限制下找到了解,直接break

} for (int i = 1; i <= maxd; i++)

printf("%d", b[i]);

puts("");

} int main()

UVA 11882 dfs搜尋 bfs剪枝

uva 11882 dfs搜尋 bfs剪枝 給你乙個r c的數字矩陣,要求從任意乙個點開始走,只能上下左右走,求走的過數連線起來最大是多少。直接dfs每乙個數字,在每一層dfs中,加上bfs 判斷剩下的數連線起來能否大於當前的ans 不能的話 剪枝了。雖然思路是這樣的,但昨天一直tle,或許姿勢不對...

bfs 大火蔓延的迷宮,UVA 11624

一開始wa了,因為以為只有乙個火源,其實有多個 portions 真的需要加強英語閱讀能力了。解法 這就是乙個加了一些限制條件的迷宮問題,限制條件是迷宮會著火,隨著時間的推移火會蔓延,仔細思考就會發現每個格仔著火的時間是固定而且有跡可循的,如果能預處理出每個格仔著火的時間,那麼問題就已經解決了 只需...

UVA 10099 最大的最小邊。。

題目連線 這個題很yd,之前一直不知道導遊還要佔乙個容量,所以連樣例都搞不懂。悲催。解法是利用floyd演算法,最後求出那條邊之後再做一下出發就ok了 我的 include include includeusing namespace std int n,m int dis 105 105 int ...