poj 2438 构造哈密顿圈(孩子只想和喜欢的相邻)

哈密顿圈问题是NP完全的 【哈密顿圈问题】 对于一个有向图G=(V,E),如果G中的圈C恰好经过每一个顶点一次,则称圈C是一个哈密顿圈。即,哈密顿圈构成一条经过所有的顶点,没有重复的“路线”。如图6是一个含有哈密顿圈的图。 图6 一个含有哈密顿圈的有向图 证明哈密顿圈问题是NPC的,可以通过证明3-SAT≤p\leq_p≤p​哈密顿圈来得到。 【3-SAT≤p\leq_p≤p​哈密顿圈】 构造方法如下: (1)对于每一个... 阅读详情

题意:有2n个孩子,现在要让他们坐成一个圈。输入为一系列二元组(a,b),表示孩子a不要和孩子b相邻。已知一个孩子最多讨厌n-1个孩子。问符合要求能否将孩子排列成一个圈,如果能,输出其中一种方案。

思路:以孩子互相喜欢连边构图。题意即求此图的一个哈密顿圈。由哈密顿图的dirac充分条件可知,此图是哈密顿图,所以肯定能够将孩子排成圈。找圈分4步:

1、首先任意选取一个初始顶点s,然后找一个与其相邻的点t;

2、反复扩展t,以找到一条路径;t保存为刚刚扩展到的点;

3、若st之间有边相连,即找到一个圈,待用;否则,将路径改造成圈:在st路径中找一点i(i必存在),使其满足s与i相邻并且i-1与t相邻。则s...i-1,t...i,s为一个圈,注意需要逆转数组的一部分。

4、如果所有点找到,输出;否则,找到一个没有在当前圈中的点i,找到其在属于圈中的相邻点j。变换使得j-1为新的起点而i为新的终点(需要逆转数组中的两部分)。返回步骤2继续扩展路径。


因为求解过程中要翻转数组,自己写当然可以,但是用stl的reverse函数会简化编程。

无stl版本:

#include <stdio.h>
#include <string.h>
#define N 205*2
int g[N][N],used[N],res[N];
int n,m,len;
void init(){
	int i,j;
	memset(g,0,sizeof(g));
	for(i = 1;i<=n;i++)
		for(j = 1;j<=n;j++)
			if(i!=j)
				g[i][j] = 1;
	memset(used,0,sizeof(used));
}
void reverse(int x,int y){
	int i,mid = (x+y)/2;
	for(i = x;i<=mid;i++){
		int temp = res[i];
		res[i] = res[y-i+x];
		res[y-i+x] = temp;
	}
}
int now(){
	int i,res=0;
	for(i = 1;i<=n;i++)
		res += used[i];
	return res==n;
}
void find_halmiton(){
	int s=1,t,i,j;
	for(i = 1;i<=n;i++)
		if(g[s][i])
			break;
	t = i;
	used[s] = used[t] = 1;
	res[0] = s;
	res[1] = t;
	len = 2;
	while(1){
		while(1){//反复扩展t,直到无法扩展
			for(i = 1;i<=n;i++)
				if(!used[i] && g[t][i]){
					res[len++] = i;
					used[i] = 1;
					t = i;
					break;
				}
			if(i>n)
				break;
		}
		if(!g[s][t]){//如果st不相邻,构造圈
			for(i = 2;i<len-1;i++)
				if(g[s][res[i]] && g[res[i-1]][t])
					break;
			reverse(i,len-1);
		}
		if(now())//如果所有点都找到
			break;
		for(i = 1;i<=n;i++){//找一个没有在当前圈中的顶点
			if(used[i])
				continue;
			for(j = 1;j<len;j++)//找到它在属于当前圈中的相邻点
				if(g[i][res[j]])
					break;
			if(j < len)
				break;
		}
		s = res[j-1];
		t = i;
		reverse(0,j-1);
		reverse(j,len-1);
		res[len++] = i;
		used[i] = 1;
	}
}
int main(){
	freopen("a.txt","r",stdin);
	while(scanf("%d %d",&n,&m) && (n+m)){
		int i,j,a,b;
		n<<=1;
		init();
		for(i = 0;i<m;i++){
			scanf("%d %d",&a,&b);
			g[a][b] = g[b][a] = 0;
		}
		find_halmiton();
		for(i = 0;i<len;i++)
			printf("%d ",res[i]);
		putchar('\n');
	}
	return 0;
}

用reverse版本:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
#define N 405
#define INF 0x3fffffff
#define clc(s,t) memset(s,t,sizeof(s))
int g[N][N],used[N],res[N],n,m,len;
int finish(){
	for(int i = 1;i<=n;i++)
		if(!used[i])
			return 0;
	return 1;	
}
void solve(){
	int i,j,s,t;
	s = t = 1;
	used[s] = 1;
	res[++len] = s;
	while(1){
		while(1){
			for(i = 1;i<=n;i++)
				if(!used[i] && g[t][i])
					break;
			if(i>n)
				break;
			used[i] = 1;
			res[++len] = i;
			t = i;
		}
		if(!g[s][t]){
			for(i = 2;i<=len;i++)
				if(g[res[i-1]][t] && g[res[i]][res[0]])
					break;
			reverse(res+i,res+len+1);
		}
		if(finish())
			break;
		for(i = 1;i<=n;i++){
			if(!used[i]){
				for(j = 0;j<=len;j++){
					if(g[i][res[j]])
						break;
				}	
				if(j<=len)
					break;
			}	
		}
		t = res[j];
		s = res[j-1];
		reverse(res,res+j);
		reverse(res+j,res+len+1);
		
	}	
}
int main(){
	freopen("a.txt","r",stdin);
	while(scanf("%d %d",&n,&m) && (n+m)){
		int i,j,a,b;
		clc(used,0);
		n <<= 1;
		len = -1;
		for(i = 1;i<=n;i++)
			for(j = 1;j<=n;j++)
				g[i][j] = 1;
		for(i = 1;i<=m;i++){
			scanf("%d %d",&a,&b);
			g[a][b] = g[b][a] = 0;	
		}
		solve();
		for(i = 0;i<n;i++)
			printf("%d ",res[i]);
		putchar('\n');
	}
	return 0;	
}


1~10000个整数的哈密顿圈 1~10000个整数的哈密顿圈。把1~10000这10000个整数重新排列,使每相邻的两个整数之和都是某一个整数的平方,并且首尾两个整数的和也是某一个整数的平方,这样就构成了一个哈密顿圈 立即下载

相关推荐

zemax光线光扇图

通过入瞳某一坐标(PX,PY)的光线在像面上有唯一的位置(EX,EY),以EX,EY为纵坐标,以PX,PY为横坐标,分别建立坐标系,把通过入瞳的光线都在坐标系里描点就得到了光扇图。对于视场内任意一点,取其子午面内的光线,以光线在光阑面上的透射点坐标为横坐标,同时以该光线在像面上的坐标为纵坐标,描出所有点,构成的图形即为子午面光扇图。在焦点位置,曲线的斜率为0,也就是说,不管入射时的横坐标(光阑面上的位置)是多少,离轴多远,都将汇聚在焦点处。此时,子午面和弧矢面有不同的分布,两条曲线不重合。

fendoudecheng的博客 8099

图论---Hamilton圈

xxxxx

qq_18230813的博客 1万+

PLC与变频器联动控制:从开关量、模拟量到通讯的接线与编程实战

在工业自动化系统中,电机调速控制是核心需求之一,其关键在于实现可编程逻辑控制器(PLC)与变频器之间的可靠联动。其基本原理是通过PLC输出控制信号,由变频器接收并驱动电机按设定速度运行。这项技术的核心价值在于实现电机的软启停、精确调速与节能控制,广泛应用于风机、水泵、传送带及精密张力控制等场景。其中,开关量控制以其接线简单、抗干扰能力强的特点,成为基础且可靠的方案;而模拟量控制则能实现无级平滑调速,满足更高精度的工艺要求。本文以西门子、三菱等主流品牌为例,深入解析了这两种主流控制方式的硬件接线、参数设置与梯

1270

POJ - 2438 哈密顿回路遍历

1 /* 2 POJ - 2438 哈密顿回路 3 图的可行遍问题:一般就是哈密顿图和欧拉图 4 这类问题,代码和算法本身简单,关键就在于建模。 5 一般判断问题只要判断是否可行遍历! 6 但是有的时候会有奇葩的要求: 7 例如:遍历一张欧拉回路图:深度遍历不回溯法,o(n) 8 遍历哈密顿回路:这道题 9 言归正传: 10 ...

weixin_30922589的博客 267

PWM调节DCDC参数计算原理

SOC芯片的核电压、GPU电压、NPU电压、GPU电压等,都会根据性能和实际应用场景来进行电压和频率的调整。 即动态电压频率调整DVFS(Dynamic Voltage and Frequency scaling),优化性能和功耗。

电子绿洲的博客 3162

OpenCode:终端开源AI编程助手,多模型接入与实战指南

AI编程助手正在从IDE侧边栏走向终端环境。其核心原理是让模型直接读取项目文件、执行命令、查看报错,形成从诊断到修复的完整闭环,从而解决传统插件上下文割裂的问题。技术价值在于开源透明、模型无关,既可接入OpenAI等云端服务,也能通过Ollama连接本地模型,兼顾数据安全与离线场景。在工程实践中,它适用于长时间驻留项目、自动修Bug、团队统一AI工具链等需求。OpenCode正是这样一款终端AI助手,支持灵活配置第三方API密钥,提供免费档与Go套餐,并通过Skills技能系统让模型遵循标准操作流程。同时,

weixin_28745821的博客 327

poj2438(哈密顿图)

Children's Dining Time Limit:1000MS Memory Limit:65536K Total Submissions:4438 Accepted:642 Special Judge Description Usually children in kindergart...

weixin_30677475的博客 182

机械臂开发必备:KDL库正逆解与动力学实战指南

在机器人算法领域,运动学与动力学计算是机械臂控制、仿真与轨迹规划的核心基础。正运动学描述关节空间到笛卡尔空间的映射,逆运动学则需要求解复杂的非线性方程,工程实现时常面临数值稳定性与调试效率的挑战。KDL(Kinematics and Dynamics Library)作为ROS生态中广泛使用的开源库,提供了统一的模型描述与高效求解器,将正逆解、雅可比矩阵及动力学参数计算封装为简洁接口,大幅降低开发门槛。无论是机械臂的笛卡尔空间轨迹跟踪,还是基于动力学模型的前馈控制,KDL都展现出强大的工程价值。本文从运动学

weixin_33860528的博客 2506

哈密顿图 哈密顿回路 哈密顿通路(Hamilton)

概念:   哈密顿图:图G的一个回路,若它通过图的每一个节点一次,且仅一次,(那么,问题来了,既然要回到起始点,是不是应该说除了起点以外的点通过一次且仅一次,而起点这个点,作为哈密顿回路的时候需要两次到达)就是哈密顿回路.存在哈密顿回路的图就是哈密顿图.哈密顿图就是从一点出发,经过所有的必须且只能一次,最终回到起点的路径.图中有的边可以不经过,但是不会有边被经过两次.   与欧拉图的区别:欧拉...

既然弱小,就只顾变强就是了 8887

12、硬件工程师笔试面试——MOS管(2025版本)

在设计和测试过程中,可以参考相关的EMC测试标准和指南,如CE认证EMC电磁兼容测试介绍 和电磁兼容性(EMC)测试方法与整改指南 ,以及电磁兼容(EMC)的标准与测试内容 ,来确保MOSFET的EMC性能符合行业标准。在高频应用中,MOSFET的开关速度对电路的整体性能至关重要。是一款高电压同步N沟道MOSFET驱动器,具有自举电源电压至114V的能力,宽VCC电压范围,自适应贯通保护功能,以及高达1.4A的峰值顶端栅极上拉电流,适用于分布式电源架构、汽车电源、高密度电源模块和电信系统等应用。

XU157303764的博客 7093

DeepSeek揭秘:构建高效反洗钱智能监控系统的全流程与代码实例

在金融领域,反洗钱(AML)是一项至关重要的任务。随着金融交易的复杂性和规模不断增长,传统的手工监控方法已无法满足现代金融系统的需求。因此,开发一个智能监控系统来自动识别和报告可疑交易变得尤为重要。本文将详细介绍如何使用DeepSeek技术构建一个高效的反洗钱智能监控系统,并提供相关的代码实例。

理论都是虚的,代码才是王道。 885

哈密顿图

哈密顿图,存在哈密顿回路的图。 哈密顿路径。 1.当度数最小的2个点的度数之和大于等于n时,存在哈密顿路径 poj2438 给定2个人之间有敌对关系,不能坐在一起。 给定有敌对关系的点,求是否存在哈密顿路径? #include #include #include using namespace std;

unintended 1472

HDR 人像肤色稳定实战:AE/AWB/ToneMap 冲突解耦与优先级裁决

人像 HDR 最容易“翻车”的就是**肤色飘**:AE 抢亮度、AWB 拉白点、TM 又在肩部压高光,三方各自“对”却合起来“错”。本文给出一套**工程可落地**的裁决策略:以**肤色 ROI 锚点**为最高约束,AE 先对脸部入射照度收敛,AWB 在**肤色先验 + 光源模型**下缓变,TM 采用**色相保持 + 中灰/肤色双锚**且时域一致化。配套**阈值与回归**(ΔE00、亮度漂移 RMS、频闪注入),把“主观对”的口径落到**可度量**,并给出逆光、多脸、霓虹等极端场景的**例外分流**。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1205

poj2438 哈密顿图

Children's Dining Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4429   Accepted: 637   Special Judge Description Usually children in kindergarten like to

猿的进化 864

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

POJ 2438 哈密顿回路模板题

题意: n个人,m行描述n个人的关系,n个人两两都有边相连,m行表示这两个点没有边相连。输出一条哈密顿回路(每个点必须经过一次) 分析: 哈密顿回路模板: #include&lt;stdio.h&gt; #include&lt;string.h&gt; #include&lt;algorithm&gt; using namespace std; const int maxn=405;...

兜率工的博客 600

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

欧拉回路及哈密顿回路浅见(UVA10054\POJ 2230\POJ2438\HDU1116)

欧拉图: 在图为连通图的前提下,欧拉通路:当前图中经过每条边一次且仅一次,若最终回到出发点则称为欧拉回路。 相关判定条件(图联通)          (1)无向图存在欧拉回路的条件是:图中不存在奇度结点,有向图存在欧拉回路的条件是:每个结点出度均等于入度。          (2)无向图存在欧拉通路的条件是:图中仅存在两个奇度结点(起点和终点),有向图存在欧拉通路的条件是:存在两个结点入度

云游code的博客 6410

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

哈密顿圈问题

【哈密顿圈问题】 对于一个有向图G=(V,E),如果G中的圈C恰好经过每一个顶点一次,则称圈C是一个哈密顿圈。即,哈密顿圈构成一条经过所有的顶点,没有重复的“路线”。如图6是一个含有哈密顿圈的图。 图6 一个含有哈密顿圈的有向图 ,.♥,.,.♥,.,.♥,.♥,.,.♥,.,.♥,.,.♥,.,.♥,.,.♥,.,.♥,.,.♥♥,.,.♥,.,.♥,.,.♥,.♥,.,.♥,.,.♥,.,....

Valieli的博客 2740

hdu 4337——poj 2438(哈密尔顿回路求解模板)

转:http://imlazy.ycool.com/post.2072698.html   Dirac 定理:设一个无向图中有 N 个节点,若所有节点的度数都大于等于 N/2,则汉密尔顿回路一定存在。注意,“N/2” 中的除法不是整除,而是实数除法。如果 N 是偶数,当然没有歧义;如果 N 是奇数,则该条件中的 “N/2” 等价于 “⌈N/2⌉”。 证明起来不难。首先可以证明图一定是连通的

Weiguang_123的专栏 6432

poj 2438哈密顿回路

Children's Dining Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4263   Accepted: 582   Special Judge Description Usually children in kindergarten like

Inkbamboo专栏 872

POJ2438(哈密顿回路模板题)

转自:http://blog.youkuaiyun.com/yihuikang/article/details/7832201 就是经过无权图每一个节点且每个节点只能经过一次所形成的回路, 抄了一下大神的模板,理解学习中······ #include #include #include #include using namespace std; int ans[600]; int cnt=0; int

iewlhf的博客 728

poj2438(哈密顿回路)

这道题完全是使用的网上模版!自己根据定理来写的一直报WA。 哈密顿图 定义:经过图中每个顶点一次且仅一次的回路(通路)称为哈密回路(通路)。 存在哈密顿回路的图称为哈密顿图。 #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> using namespace std; const int maxn=505; int ans[maxn],g[maxn][maxn

Keep_Trying_Go的博客 427

1~10000这10000个数的整数哈密顿圈

1~10000这10000个数的整数哈密顿圈         把1~n这n个数重新排列,使相邻两个数的和是一个整数的平方,且首尾两个数的和也是一个整数的平方,这样一列数也是一个哈密顿圈。

duzuokanyunqi的专栏 6431

poj 2438

这是一道求哈密尔顿回路的问题。          首先介绍一下什么是哈密尔顿回路。哈密尔顿回路是指从一个点出发,经过图中每个点一次且仅一次,最后回到出发点的一条回路。目前没有判断哈密尔顿回路的充要条件,但有一些有用充分条件或必要条件。其中此题要用到其中一条充分条件:如果图G的每个点的度之和大于等于n(n为图G的顶点数),则图G存在哈密尔顿回路。          然后介绍一下算法:    

水题收集者 772

哈密顿圈问题相关

1.文章缘由 毕业论文与这个相关,于是搜索了一些资料,看到有位前辈做过研究,感觉挺有意思。 2.哈密顿圈问题简介 参考自百度百科:哈密顿圈问题(Hamilton circuit problem)是图论中著名的难题之一。巡回售货员问题有一个基于图的天然类似问题,它是图论中的一个基本问题,给定一个有向图G(V,E),如果G中的圈C恰好经过每一个顶点一次,则称圈C是一个哈密顿圈。换句话说,它构成一条经过所有顶点的、没有重复的“路线”。哈密顿圈问题如下:给定一个有向图G,问它有一条哈密顿圈吗? 3.研究的问

m0_48693954的博客 1869

最简单的哈密顿圈

最简单的哈密顿圈       最简单的哈密顿圈就是哈密顿提出的问题:地球上有二十个城市构成一个正十二面体,怎样做到不重复的走遍每一个城市回到出发地?这个问题在300多年前成为了当时上流社会聚会时的时尚话题,每个人都以自己能发现更多条回路为荣!下面我给出了正十二面体摊平以后的变形图,并且标注了每条路径的距离,列出所有共60条回路,以及回路的距离。在计算回路的过程中力求尽早得到路径最短的回路第二条

duzuokanyunqi的专栏 1万+
上一篇: poj 2404 floyd+状态压缩(中国邮递员问题)
下一篇: poj 3311 dp求解TSP
dumeichen
博客等级 码龄13年 55粉丝 475原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值