关于蛮力法求解哈密顿回路的一点粗浅认识

       蛮力法只是用遍历的技术,尝试所有可能的解,直到找到一条回路或者返回无解。所以先输入无向图,再得到全排列,最后遍历全排列即可。

代码如下:

#include<iostream>
#include<algorithm> 
using namespace std;
void ml(int g[1000][100],int graph[50][50],int n,int l)
{
	int i,j;
	int b[10];
	for(i=0;i<l;i++)
	{
		for(j=0;j<n-1;j++)
		{
			if(graph[g[i][j]-1][g[i][j+1]-1]==0)
				break;                                              //相邻顶点之间不存在边,跳出循环
			else if(graph[g[i][j]-1][g[i][j+1]-1]==1 && j!=n-2)
				b[j]=g[i][j];                                       //将符合条件的顶点记录
			else if(graph[g[i][j]-1][g[i][j+1]-1]==1 && j==n-2)
			{
					if(graph[g[i][n-1]-1][g[i][0]-1]==0)
						break;         //最后一个顶点和第一个顶点之间不存在边,跳出循环
					else if(graph[g[i][n-1]-1][g[i][0]-1]==1)
					{
						b[n-2]=g[i][n-2];
						b[n-1]=g[i][n-1];
						cout<<"哈密顿回路为:";
						for ( j = 0;j <= n-1;j++)  
							cout << b[j] << "\t";
						cout<<endl;
						return;                     //输出一条哈密顿回路,跳出整个循环
					}
				
			}
		}
		if(i==l-1)
			cout<<"不存在哈密顿回路"<<endl;                   //无哈密顿回路,输出无解信息
	}
}

int main()
{
	int n,i,j;
	j=0;
    cout << "请输入点的个数:" << endl;
	cin>>n;
    int a[100];
    for(i=0;i<n;i++)
	{
		a[i]=i+1;
	}                                  //将各个顶点化作序列数
	int l=1;
	for(i=n;i>=1;i--)
	{
		l=l*i;

	}                                  //计算全排列个数
	int g[1000][100];
	do
	{
		for(i=0;i<=n-1;i++)
		{
			g[j][i]=a[i];
		}
		j++;
	}while (next_permutation(a,a+n));   //将全排列输入矩阵
    int graph[50][50];
    for (i = 0;i < n;++i)
    {
        cout << "请输入图的第" << i+1 << "行" << endl;
        for (j = 0;j <n;++j)
        {
            cin >> graph[i][j];
        }
    }                                   //将无向图导入矩阵
	ml(g,graph,n,l);
    return 0;
}

​

例子:

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

设计与分析 作者-王红梅 出版社-清华大学出版社 出版日期-07 1 2006. 共262页 目录 第 1 章 绪论 1 .1 算的基本概念 1 . 1 . 1 为什么要学习算 1 . 1 . 2 算及其重要特性 1 . 1 . 3 算的描述方 1 . 1 . 4 算设计的一般过程 1 . 1 . 5 重要的问题类型 1 .2 算分析 1 . 2 . 1 渐进符号 1 . 2 . 2 最好、 最坏和平均情况 1 . 2 . 3 非递归算的分析 1 . 2 . 4 递归算的分析 1 . 2 . 5 算的后验分析 1 .3 实验项目— — —求最大公约数 阅读材料— — —人工神经网络与 BP 算 习题 1 第 2 章 NP 完全理论 2 .1 下界 2 . 1 . 1 平凡下界 2 . 1 . 2 判定树模型 2 . 1 . 3 最优算 2 .2 算的极限 2 . 2 . 1 易解问题与难解问题 2 . 2 . 2 实际问题难以求解的原因 2 . 2 . 3 不可解问题 2 .3 P 类问题和 NP 类问题 2 .3 .1 判定问题 2 .3 .2 确定性算与 P 类问题 2 .3 .3 非确定性算与 NP 类问题 2 .4 NP 完全问题 2 .4 .1 问题变换与计算复杂性归约 2 .4 .2 NP 完全问题的定义 2 .4 .3 基本的 NP 完全问题 2 .4 .4 NP 完全问题的计算机处理 2 .5 实验项目— — —SAT 问题 阅读材料— — —遗传算 习题 2 第 3 章 蛮力 3 .1 蛮力的设计思想 3 .2 查找问题中的蛮力 3 .2 .1 顺序查找 3 .2 .2 串匹配问题 3 .3 排序问题中的蛮力 3 .3 .1 选择排序 3 .3 .2 起泡排序 3 .4 组合问题中的蛮力 3 .4 .1 生成排列对象 3 .4 .2 生成子集 3 .4 .3 0 / 1 背包问题 3 .4 .4 任务分配问题 3 .5 图问题中的蛮力 3 .5 .1 哈密顿回路问题 3 .5 .2 TSP 问题 3 .6 几何问题中的蛮力 3 .6 .1 最近对问题 3 .6 .2 凸包问题 3 .7 实验项目— — —串匹配问题 阅读材料— — —蚁群算 习题 3 第 4 章 分治 4 .1 概述 4 .1 .1 分治的设计思想 4 .1 .2 分治求解过程 4 .2 递归 4 .2 .1 递归的定义 4 .2 .2 递归函数的运行轨迹 4 .2 .3 递归函数的内部执行过程 4 .3 排序问题中的分治 4 .3 .1 归并排序 4 .3 .2 快速排序 4 .4 组合问题中的分治 4 .4 .1 最大子段和问题 4 .4 .2 棋盘覆盖问题 4 .4 .3 循环赛日程安排问题 4 .5 几何问题中的分治 4 .5 .1 最近对问题 4 .5 .2 凸包问题 4 .6 实验项目— — —最近对问题 阅读材料— — —鱼群算 习题 4 第 5 章 减治 5 .1 减治的设计思想 5 .2 查找问题中的减治 5 .3 排序问题中的减治 5 .4 组合问题中的减治 5 .5 实验项目— — —8 枚硬币问题 阅读材料— — —粒子群算 习题 5 第 6 章 动态规划 6 .1 概述 6 .2 图问题中的动态规划 6 .3 组合问题中的动态规划 6 .4 查找问题中的动态规划 6 .5 实验项目— — —最大子段和问题 阅读材料— — —文化算 习题 6 第 7 章 贪心 7 .1 概述 7 .2 图问题中的贪心 7 .3 组合问题中的贪心 7 .4 实验项目— — —霍夫曼编码 阅读材料— — —模拟退火算 习题 7 第 8 章 回溯 8 .1 概述 8 .2 图问题中的回溯 8 .3 组合问题中的回溯 8 .4 实验项目— — —0/ 1 背包问题 阅读材料— — —禁忌搜索算 习题 8 第 9 章 分支限界 9 .1 概述 9 .2 图问题中的分支限界 9 .3 组合问题中的分支限界 9 .4 实验项目— — —电路布线问题 阅读材料— — —免疫算 习题 9 第 10 章 概率算 10 .1 概述 10 .1 .1 概率算的设计思想 10 .1 .2 随机数发生器 10 .2 舍伍德(Sherwood)型概率算 10 .2 .1 快速排序 10 .2
©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值