⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 哈密顿回路 回溯法.txt

📁 ACM资料大集合
💻 TXT
字号:
#include <iostream>
#include <iomanip>
#include <stdio.h>
using namespace std;

//哈密顿回路 回溯法
/*
输入:
5 7
1 2
1 4
2 3
2 5
3 5
3 4
4 5

输出:
k=1  0  0 -1 -1 -1
k=2  0  1  0 -1 -1
k=3  0  1  2  0 -1
k=4  0  1  2  3  0
k=3  0  1  2  4 -1
k=4  0  1  2  4  0
k=4  0  1  2  4  3
1
*/
int path[11][11]={0};
int next[11]={-1};
int visited[11]={0};
int save;

void print(int num,int k)
{
	int i;
	cout<<"k="<<k;
	for(i=0;i<num;i++)
		printf("%3d",next[i]);
	cout<<endl;
}

void init()
{
	int i;
	for(i=0;i<11;i++)
		next[i]=-1;//next[i]表示第i次要访问的点,初始化,表示还未开始访问
}
bool HAMIDUN(int num,int start)
{
	int k=1,now=1,s=start;
	init();//初始化
	visited[start]=1;//访问第一个点
	next[start]=start;
	while(k>=1)//从第2个点开始访问
	{
		next[k]++;//开始访问,访问下一个点,设为A处
		print(num,k);
		while(next[k]<num)
		{
			if(visited[next[k]]==0&&path[next[k-1]][next[k]]==1) 
				break;//第k次正在访问的点符合条件
			next[k]++;
		}
		if(next[k]<num)
		{	
			//该点符合条件
			if(k==num-1&&path[next[k]][start]==1)
			{
			//访问到最后一个点,且已形成哈密顿回路
				visited[next[k]]=1;
				print(num,k);
				return true;
			}
			else if(k<num-1) 
			{	//还未访问完,继续下一次访问
				visited[next[k]]=1;//访问该点
				k++;
			}
		}
		else
		{	//该点不符合条件,回溯
			visited[next[k-1]]=0;//上一次访问的点无效(也就是还未访问)
			//注意,此时next[k-1]不是为0,而是为上次访问后停留的位置
			//回溯后从上次停留的位置后面(注意A处)开始访问
			next[k]=-1;	//本次访问未得到合适的点	
			k--;
		}
	}
	return false;
}

int main()
{
	int num,ta,tb,pathnum,i;
	scanf("%d%d",&num,&pathnum);
	for(i=0;i<pathnum;i++)
	{
		scanf("%d%d",&ta,&tb);
		path[ta-1][tb-1]=path[tb-1][ta-1]=1;
	}
	printf("%d",HAMIDUN(num,0));
	return 0;
}















#include <iostream>
#include <iomanip>
#include <stdio.h>
using namespace std;

//哈密顿回路 回溯法
/*
输入:
5 7
1 2
1 4
2 3
2 5
3 5
3 4
4 5

输出:
k=1  0  0 -1 -1 -1
k=2  0  1  0 -1 -1
k=3  0  1  2  0 -1
k=4  0  1  2  3  0
k=3  0  1  2  4 -1
k=4  0  1  2  4  0
k=4  0  1  2  4  3
1
*/
int path[11][11]={0};
int next[11]={-1};
int visited[11]={0};
int save;

void print(int num,int k)
{
	int i;
	cout<<"k="<<k;
	for(i=0;i<num;i++)
		printf("%3d",next[i]);
	cout<<endl;
//	system("pause");
}

void init()
{
	int i;
	for(i=0;i<11;i++)
		next[i]=-1;
}
bool HAMIDUN(int num,int start)
{
	int k=1,now=1,s=start;
	init();
	visited[start]=1;
	next[start]=start;
//	next[0]=1;
	while(k>=1)
	{
		next[k]++;
		print(num,k);
//		save=next[k];
//		visited[next[k]]=0;
		while(next[k]<num)
		{
			if(visited[next[k]]==0&&path[next[k-1]][next[k]]==1) 
			{
				s=next[k];
				break;
			}
			next[k]++;
		}
		if(k==num-1&&path[next[k]][start]==1&&next[k]<num)
		{
			visited[next[k]]=1;
			print(num,k);
//			next[k]=start;
			return true;
		}
		else if(next[k]<num&&k<num-1) 
		{
			visited[next[k]]=1;
			k++;
		}
		else
		{
//			visited[next[k-1]]=0;
//			next[k-1]=0;
//			if(k<num) 
//			{
		
//			if(next[k]>=num) next[k]=save;
//			if(next[k]>=num) visited[save]=0;
//			else 
			visited[next[k-1]]=0;
//			next[k-1]++;
				next[k]=-1;		
//			}
	//		next[k]=0;
	//		visited[next[k]]=0;
			k--;
		}
	}
	return false;
}

int main()
{
	int num,ta,tb,pathnum,i;
	scanf("%d%d",&num,&pathnum);
	for(i=0;i<pathnum;i++)
	{
		scanf("%d%d",&ta,&tb);
		path[ta-1][tb-1]=path[tb-1][ta-1]=1;
	}
	printf("%d",HAMIDUN(num,0));
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -