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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c++【键盘读入操作】,两种方法做小游戏的控制摇杆

    c++【键盘读入操作】,两种方法做小游戏的控制摇杆

    2021年3月12日
    183
  • Android面试题:Retrofit「建议收藏」

    目录源码:相关视频:相关文章:一、简介:二、Retrofit常用参数注解:三、Retrofit使用:源码:square/retrofit相关视频:Retrofit网络库相关文章:Android优雅的让RxJava2.0+Retrofit2.0结合使用手写Rxjava+Retrofit+Mvp这是一份很详细的Retrofit2.0使用教…

    2022年4月13日
    36
  • Java二维数组排序

    Java二维数组排序Java二维数组排序

    2022年4月29日
    46
  • CSS实现文字两端对齐

    CSS实现文字两端对齐最近的项目遇到了这样的需求:(要求标题部分不管文字多少,都必须两端对齐)如下图:当时也没有多想直接使用‘&ensp;’进行代替,毕竟产品同学想快一点看到效果,不敢怠慢!不过到第二个页面就傻

    2022年7月3日
    20
  • 比较文本相似度_比较文本差异的工具

    比较文本相似度_比较文本差异的工具from:https://cloud.tencent.com/developer/news/218062本文作者为YvesPeirsman,是NLP领域的专家。在这篇博文中,作者比较了各种计算句子相似度的方法,并了解它们是如何操作的。词嵌入(wordembeddings)已经在自然语言处理领域广泛使用,它可以让我们轻易地计算两个词语之间的语义相似性,或者找出与目标词语最相似的词语。然而…

    2022年10月30日
    0
  • 航信金税接口「建议收藏」

    航信金税接口「建议收藏」我看到很多的航信接口,但是我发现好多都是中间商在宣传自己的接口,偶尔几个也是要积分的,像我这种白piao党那是没有积分的,下面是我给现在在做航信接口的基友们的一点建议前期条件1.本地电脑的金税环境(开票软件,智税集成)2.航信测试盘,测试注册文件(必需品)3.开发文档(一般没有,有的话也是经过二次修改过的那种)一些需要注意的地方:引用的dll是taxCardx,这个一般装了金税环境…

    2022年4月30日
    46

发表回复

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

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