大连理工大学算法分析与设计算法总结.docxVIP

大连理工大学算法分析与设计算法总结.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
一,马步程序 简要算法描述: 算法从1号节点作为当前节点开始进行搜索。从小到大深度优先尝试所有相连的节点,并把它作为下一次 搜索的当前节点,如果最终能够回到起始点,并且每个节点经过且仅经过一次,则存在一条哈密顿回路。否则不 存在哈密顿回路。 优化: 如果走一步之后发现,存在度数小于2的未走过的节点,则没有必要继续搜索,只能尝试其他节点。 如果发现,当前存在大于等于两个度数为2的节点,则直接回溯到上一层节点,没有必要继续搜索。 回溯到第一个节点后,如果没找到哈密顿回路则直接退出,没有必要尝试其他走法,因为另一条路径与当 前遍历过的路径是对称的。 #inelude iostream #inelude cstdio #inelude cstring using namespace std; const int Maxn = 10000; int dirx[] = {-1,?2,1, 2, 2, 1}; int diry[] = {-2,1, 2, 2, 1,?2}; int nl, n2, n; bool used[Maxn]; int ans[Maxn]; int degree[Maxn]? deg[Maxn]; int graph[Maxn][8]; bool valid(int x, int y) { return x = 0 x nl y = 0 y n2; } void getGraph() { for (int i = 0; i n; ++i) { int row = i / n2; int col = i % n2; degree[i] = 0; for (int j = 0; j 8; ++j) { int x = row + dirx[j]; int y = col + diry[j]; if (!valid(x, y)) tontinue; graph[i][degree[i]++] = x * n2 + y; } deg[i] = degreefi]; } void resume(int cur) { for (int i = 0; i degree[cur]; ++i) { int next = graph[cur][i]; if (used[next]) continue; deg[next]++; } } bool update(int cur) { bool ret = true; for (int i = 0; i degree[cur]; ++i) { int next = graph[cur][i]; if (used[next]) continue; deg[next] if (deg[next] 2 next != graph[0][l]) ret = false; } if (!ret) { resume(cur); return false; } return true; } bool dfs(int step,int cur) //递归版 { ans[step] = cur; if (step == n ? 1) { if (graph[0][1] != cur) return false; for (int i = 0; i n; ++i) printf(n%d , ans[i]); puts (????); return true; } for (int i = 0; i degree[cur]; ++i) { if (cur == 0 i) break; int next = graph[cur][i]; if (used[next]) continue; used[next] = true; if (lupdate(cur)) { used[next] = false; continue; } if (dfs(step + 1, next)) return true; resume(cur); used[next] = false; } return false; } bool check()// goto 版 { int w[Maxn] = {0}; memset(used, false, sizeof(used)); int cur = 0, next; used[0] = true; int 10: i, step = 0; i = -1^ ans[step] = cur; if (step == n - 1) { if (graph[0][1] != cur) goto 12; for (int i = 0; i n; ++i) printf(H%d ans[i]); puts (???); return true; } 11: w[st

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档