对哈密顿回路问题的求解方法

  哈密顿图(哈密尔顿图)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。从一张普通图的任意一点出发,路途中经过图中每一个结点当且仅当一次,则成为哈密顿回路。

  这是题目的描述,其中的关键信息有“无向图”“每一个结点”“当且仅当一次”等,得出的要满主的条件:封闭的环;是一个连通图,且图中任意两点可以到达。

  为了实现哈密顿回路首先想到的是暴力枚举法,实现的关键分为两步:第一步是:生成1到N的全排列;第二步是:验证这条通路是否满足条件。这种在想法思路上和代码量上还是不错的,为了进一步的优化想到了利用回溯法实现。

  不难发现回溯法是非常适合解决哈密顿回路问题的,可以发现,在不加权的图中,回溯法没有剪枝限制,就是一个深度优先搜索。在加权图中,当找到一条哈密顿回路后,之后搜索的时候当已花费的开支大于已知最小花费时,就剪枝,不再向下搜索,回溯至上一节点。

        暴力枚举的部分代码展示:

  start1=clock();

  f1();

  end1=clock();

  if(tot1) cout<<"该图共有"<<tot1<<"条哈密顿回路"<<endl;

  else  cout<<"该图没有哈密顿回路"<<endl;

  cout<<"方法一:暴力枚举所用时间为:"<<end1-start1<<"ms"<<endl;

  cout<<endl<<endl<<endl;

        回溯法的部分代码展示:

 start2=clock();

 f2(1,1);

 if(tot2) cout<<"该图共有"<<tot2<<"条哈密顿回路"<<endl;

 else  cout<<"该图没有哈密顿回路"<<endl;

 end2=clock();

 cout<<"方法二:回溯法所用时间为:"<<end2-start2<<"ms"<<endl;

 }

  以上就是对的哈密顿回路问题的求解方法的展示。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值