hdu 2181哈密顿绕行世界问题 dfs

30 篇文章 0 订阅
本文探讨了HDU 2181问题,这是一个涉及哈密顿回路的图论问题。利用深度优先搜索(DFS)算法进行求解,在遍历过程中,当计数达到20时,需要额外检查最后一个城市是否与起始城市相连通,以确保回路完整。
摘要由CSDN通过智能技术生成

传送门:hdu 2181

中文题就不多说了,唯一值得注意的一点是dfs到最后cnt==20的时候要先判断最后一个城市和第一个城市连不连通再输出。

#include <iostream>
#include <cstdio>
#include <cstring>
int map[22][22];
int book[22];
int line[22];
int t=0,m;
using namespace std;
int dfs(int cnt)
{
	if(cnt==20)
	{
		if(map[line[cnt-1]][m])//判断最后一个城市和第一个城市之间有没有边
		{
			printf("%d:  ",++t);
			printf("%d",m);
		for(int i=1;i<20;i++)
		{
			printf(" %d",line[i]);
		}
		printf(" %d\n",m);
		}
		return 0;
	}
	for(int i=1;i<=20;i++)
	{
		if(!book[i]&&map[line[cnt-1]][i])
		{
			book[i]=1;
			line[cnt]=i;
			dfs(cnt+1);
			book[i]=0;
		}
	}
	return 0;
}
int main()
{
	int a,b,c;
	memset(map,0,sizeof(map));
	for(int i=1;i<=20;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		map[i][a]=1;
		map[i][b]=1;
		map[i][c]=1;
	}
	/*for(int i=1;i<=21;i++)
	{
		for(int j=1;j<=20;j++)
	printf("%d ",map[i][j]);
		putchar('\n');
	}*/	
	while(scanf("%d",&m)&&m)
	{
		memset(book,0,sizeof(book));
		line[0]=m;
		book[m]=1;
		t=0;
		dfs(1);
	}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值