哈密顿图(哈密尔顿图)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。从一张普通图的任意一点出发,路途中经过图中每一个结点当且仅当一次,则成为哈密顿回路。
这是题目的描述,其中的关键信息有“无向图”“每一个结点”“当且仅当一次”等,得出的要满主的条件:封闭的环;是一个连通图,且图中任意两点可以到达。
为了实现哈密顿回路首先想到的是暴力枚举法,实现的关键分为两步:第一步是:生成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;
}
以上就是对的哈密顿回路问题的求解方法的展示。