HDU 4337 King Arthur's Knights 它输出一个哈密顿电路

HDU 4337 King Arthur's Knights 它输出一个哈密顿电路

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

n积分m文章无向边

它输出一个哈密顿电路

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

const int N = 155;

int n, m;
bool mp[N][N];

int S, T, top, Stack[N];
bool vis[N];
void _reverse(int l,int r) {
	while (l<r)
		swap(Stack[l++],Stack[r--]);
}
void expand() {
	while(1) {
		bool flag = 0;
		for (int i=1; i<=n && false == flag; i++)
			if (!vis[i] && mp[T][i])
			{
				Stack[top++]=i;
				T=i;
				flag = vis[i] = 1;
			}
		if (!flag) return;
	}
}
void hamiltun(int Start){
	memset(vis, 0, sizeof vis);

	S = Start;
	for(T=2; T<=n; T++) //随意找两个相邻的节点S和T
		if (mp[S][T]) break; 
	top = 0;
	Stack[top++]=S;
	Stack[top++]=T;
	vis[S] = vis[T] = true;
	while (1)
	{
		expand(); //在它们基础上扩展出一条尽量长的没有反复节点的路径:步骤1
		_reverse(0,top-1);
		swap(S,T);
		expand(); //在它们基础上扩展出一条尽量长的没有反复节点的路径
		int mid=0;
		if (!mp[S][T]) //若S与T不相邻,能够构造出一个回路使新的S和T相邻
		{
			//设路径S→T上有k+2个节点,依次为S,v1,v2…… vk和T.
			//能够证明存在节点vi,i∈[1,k),满足vi与T相邻,且vi+1与S相邻
			for (int i=1; i<top-2; i++)
				if (mp[Stack[i]][T] && mp[Stack[i+1]][S])
				{
					mid=i+1; break;
				}
			//把原路径变成S→vi→T→vi+1→S,即形成了一个回路
			_reverse(mid,top-1);
			T=Stack[top-1];
		}
		if (top==n) break;
		//如今我们有了一个没有反复节点的回路.假设它的长度为N,则汉密尔顿回路就找到了
		//否则,因为整个图是连通的,所以在该回路上,一定存在一点与回路以外的点相邻
		//那么从该点处把回路断开,就变回了一条路径,再依照步骤1的方法尽量扩展路径
		for (int i = 1, j; i <= n; i++)
			if (!vis[i])
			{
				for (j=1; j<top-1; j++)
					if (mp[Stack[j]][i]) break;
				if (mp[Stack[j]][i])
				{
					T=i; mid=j;
					break;
				}
			}
		S=Stack[mid-1];
		_reverse(0,mid-1);
		_reverse(mid,top-1);
		Stack[top++]=T;
		vis[T]=true;
	}
}

int main() {
	while (cin>>n>>m) {
		memset(mp, 0, sizeof mp);
		for (int i = 1, u, v; i <= m; i++) {
			scanf("%d %d",&u, &v);
			mp[u][v] = mp[v][u] = 1;
		}
		hamiltun(1);
		for (int i = 0; i < top; i++)
			printf("%d%c", Stack[i], i==top-1?'\n':' ');
	}
	return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116761.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • css3元素简单的闪烁效果(html5 jquery)

    css3Animation:@-webkit-keyframestwinkling{/*透明度由0到1*/0%{opacity:0;/*透明度为0*/}100%{opacity:1

    2021年12月20日
    54
  • JavaScript高级知识总结(高级篇)[通俗易懂]

    JavaScript高级知识总结(高级篇)[通俗易懂]目录一、深入基础1.1数据类型1.分类:2.判断:3.undefined与null的区别?4.严格区别变量类型与数据类型?1.2数据变量与内存1.什么是数据?2.什么是内存?3.什么是变量?4.内存,数据,变量三者之间的关系5.vara=xxx;a内存中到底保存的是什么?6.关于引用变量的赋值问题:7.在js调用函数时传递变量参数时,是值传递还是引用传递?8.js引擎如何管理内存1.3对象1.什么是对象?2.为什么用对象?

    2025年7月16日
    5
  • Asp中session使用方法详解[通俗易懂]

    Asp中session使用方法详解[通俗易懂]Session对象可以使用Session对象存储特定用户会话所需的信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的Web页时,如果该用户还没有会话,则Web服务器将自动创建一个Session对象。当会话过期或被放弃后,服务器将终止该会话。Sessio

    2022年7月15日
    22
  • 解决SecureCRTPortable和SecureFXPortable的中文乱码问题

    解决SecureCRTPortable和SecureFXPortable的中文乱码问题平时学习或者工作中,我们会发现Linux客户端SecureCRTPortable、SecureFXPortable连接Linux服务器时会出现中文乱码问题。通过修改配置可以解决这个问题。一、修改SecureCRTPortable的相关配置步骤一:【选项】→【全局选项】步骤二:【常规】→【默认会话】,点击【编辑默认设置】,点击【确定】步骤三:【外观】,把【字符编码】改成"UTF-8",点击…

    2022年5月5日
    53
  • eclipse 加html注释快捷键

    eclipse 加html注释快捷键1.单行注释:先写下注释,然后光标放到这一行上,接着按下ctrl+shitf+C快捷键,eclipse会自动注释掉这一行。2.多行注释,拖动鼠标选中你要注释的内容,然后再按下ctrl+shitf+c

    2022年6月14日
    64
  • 学习双拼必看:双拼输入法的心得以及快速入门办法

    学习双拼必看:双拼输入法的心得以及快速入门办法1.简单介绍一下双拼2.总共18种双拼方案3.15种双拼方案的具体映射4.顺便提一下双拼口诀的事情5.总结不同平台选择的方案双拼(也称双打)是一种建立在拼音输入法基础上的输入方法,可视为全拼的一种改进,它通过将汉语拼音中每个含多个字母的声母或韵母各自映射到某个按键上,使得每个音都可以用两个按键打出,极大地提高了拼音输入法的输入速度。这种声母或韵母到按键的对应表通常称之为双…

    2022年6月23日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号