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

news/2024/11/22 8:32:48/

概念:

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

  与欧拉图的区别:欧拉图讨论的实际上是图上关于边的可行便利问题,而哈密顿图的要求与点有关.

判定:

一:Dirac定理(充分条件)

  设一个无向图中有N个顶点,若所有顶点的度数大于等于N/2,则哈密顿回路一定存在.(N/2指的是⌈N/2⌉,向上取整),用\frac{N + 1}{2}

二:基本的必要条件

  设图G=<V, E>是哈密顿图,则对于v的任意一个非空子集S,若以|S|表示S中元素的数目,G-S表示G中删除了S中的点以及这些点所关联的边后得到的子图,则W(G-S)<=|S|成立.其中W(G-S)是G-S中联通分支数.

三:竞赛图(哈密顿通路)

  N(N>=2)阶竞赛图一定存在哈密顿通路.

算法:

一:在Dirac定理的前提下构造哈密顿回路

过程:

  1:任意找两个相邻的节点S和T,在其基础上扩展出一条尽量长的没有重复结点的路径.即如果S与结点v相邻,而且v不在路径S -> T上,则可以把该路径变成v -> S -> T,然后v成为新的S.从S和T分别向两头扩展,直到无法继续扩展为止,即所有与S或T相邻的节点都在路径S -> T上.

  2:若S与T相邻,则路径S -> T形成了一个回路.

  3:若S与T不相邻,可以构造出来一个回路.设路径S -> T上有k+2个节点,依次为S, v1, v2, ..., vk, T.可以证明存在节点vi(i属于[1, k]),满足vi与T相邻,且vi+1与S相邻.找到这个节点vi,把原路径变成S -> vi -> T -> vi+1 -> S,即形成了一个回路.

  4:到此为止,已经构造出来了一个没有重复节点的的回路,如果其长度为N,则哈密顿回路就找到了.如果回路的长度小于N,由于整个图是连通的,所以在该回路上,一定存在一点与回路之外的点相邻.那么从该点处把回路断开,就变回了一条路径,同时还可以将与之相邻的点加入路径.再按照步骤1的方法尽量扩展路径,则一定有新的节点被加进来.接着回到路径2.

证明:

  可利用鸽巢原理(抽屉原理)证明.

抽屉原理

原理1: 把多于n+1个的物体放到n个抽屉里,则至少有一个抽屉里的东西不少于两件。

证明(反证法):如果每个抽屉至多只能放进一个物体,那么物体的总数至多是n×1,而不是题设的n+k(k≥1),故不可能。

原理2:把多于mn(m乘n)+1(n不为0)个的物体放到n个抽屉里,则至少有一个抽屉里有不少于(m+1)的物体。

证明(反证法):若每个抽屉至多放进m个物体,那么n个抽屉至多放进mn个物体,与题设不符,故不可能。

原理3:把无数还多件物体放入n个抽屉,则至少有一个抽屉里有无数个物体。

原理1 、2 、3都是第一抽屉原理的表述 [2]  。

第二抽屉原理

把(mn-1)个物体放入n个抽屉中,其中必有一个抽屉中至多有(m—1)个物体(例如,将3×5-1=14个物体放入5个抽屉中,则必定有一个抽屉中的物体数少于等于3-1=2)。

伪代码:

  设s为哈密顿回路的起始点,t为哈密顿回路中终点s之前的点。ans[ ]为最终的哈密顿回路。倒置的意思指的是将数组对应的区间中数字的排列顺序方向。

  1:初始化,令s = 1,t为s的任意一个邻接点.

  2:如果ans[]中元素的个数小于n,则从t开始向外扩展,如果有可扩展点v,放入ans[]的尾部,并且t=v,并继续扩展,如无法扩展进入步骤3.

  3:将当前得到的ans[]倒置,s和t互换,从t开始向外扩展,如果有可扩展点v,放入ans[]尾部,并且t=v,并继续扩展.如无法扩展进入步骤4.

  4:如果当前s和t相邻,进入步骤5.否则,遍历ans[],寻找点ans[i],使得ans[i]与t相连并且ans[i +1]与s相连,将从ans[i + 1]到t部分的ans[]倒置,t=ans[i +1],进如步骤5.

  5:如果当前ans[]中元素的个数等于n,算法结束,ans[]中保存了哈密顿回路(可看情况是否加入点s).否则,如果s与t连通,但是ans[]中的元素的个数小于n,则遍历ans[],寻找点ans[i],使得ans[i]与ans[]外的一点(j)相连,则令s=ans[i - 1],t = j,将ans[]中s到ans[i - 1]部分的ans[]倒置,将ans[]中的ans[i]到t的部分倒置,将点j加入到ans[]的尾部,转步骤2.

时间复杂度:

  如果说每次到步骤5算一轮的话,那么由于每一轮当中至少有一个节点被加入到路径S -> T中,所以总的轮数肯定不超过n轮,所以时间复杂度为O(n^2).空间上由于边数非常多,所以采用邻接矩阵来存储比较适合。

哈密顿回路代码

const int maxN = 1e2 + 7;
int ans[maxN], N;
inline void reverse(int l, int r)   //将l到r部分翻转
{while(l < r){swap(ans[l], ans[r]);l++; r--;}
}
bool vis[maxN], mp[maxN][maxN];
void Hamilton()
{for(int i=1; i<=N; i++) vis[i] = false;int s = 1, t;//初始化取s为1号点int have_node = 2;int i, j;int w;for(i = 1; i <= N; i++) if(mp[s][i]) break;t = i;//取任意邻接与s的点为tvis[s] = vis[t] = true;ans[0] = s; ans[1] = t;while(true){while(true) //从t向外扩展{for(i = 1; i <= N; i++){if(mp[t][i] && !vis[i]){ans[have_node++] = i;vis[i] = true;t = i;break;}}if(i > N) break;}w = have_node - 1;//将当前得到的序列倒置,s和t互换,从t继续扩展,相当于在原来的序列上从s向外扩展i = 0;reverse(i, w);swap(s, t);while(true) //从新的t继续向外扩展,相当于在原来的序列上从s向外扩展{for(i = 1; i <= N; i++){if(mp[t][i] && !vis[i]){ans[have_node++] = i;vis[i] = true;t = i;break;}}if(i > N) break;}if(!mp[s][t])   //如果s和t不相邻,进行调整{for(i = 1; i < have_node - 2; i++)   //取序列中的一点i,使得ans[i]与t相连,并且ans[i+1]与s相连if(mp[ans[i]][t] && mp[s][ans[i + 1]])break;w = have_node - 1;i++;t = ans[i];reverse(i, w);  //将从ans[i +1]到t部分的ans[]倒置}   //此时s和t相连if(have_node == N) return;   //如果当前序列包含n个元素,算法结束for(j = 1; j <= N; j++)   //当前序列中元素的个数小于n,寻找点ans[i],使得ans[i]与ans[]外的一个点相连{if(vis[j]) continue;for(i = 1; i < have_node - 2; i++)if(mp[ans[i]][j])break;if(mp[ans[i]][j]) break;}s = ans[i - 1];t = j;  //将新找到的点j赋给treverse(0, i - 1);  //将ans[]中s到ans[i-1]的部分倒置reverse(i, have_node - 1);   //将ans[]中ans[i]到t的部分倒置ans[have_node++] = j;    //将点j加入到ans[]尾部vis[j] = true;}
}

 

哈密顿通路

二:N(N>=2)阶竞赛图构造哈密顿通路

N阶竞赛图:含有N个顶点的有向图,且每对顶点之间都有一条边.对于N阶竞赛图一定存在哈密顿通路.

数学归纳法证明竞赛图在n >= 2时必存在哈密顿路:

(1)n = 2时结论显然成立;

(2)假设n = k时,结论也成立,哈密顿路为V1, V2, V3, ..., Vk;

  设当n = k+1时,第k + 1个节点为V(k+1),考虑到V(k+1)与Vi(1<=i<=k)的连通情况,可以分为以下两种情况.

    1:Vk与V(k+1)两点之间的弧为<Vk, V(k+1)>,则可构造哈密顿路径V1, V2,…, Vk, V(k+1).

    2:Vk与V(k+1)两点之间的弧为<V(k+1),Vk>,则从后往前寻找第一个出现的Vi(i=k-1,i>=1,--i),满足Vi与V(k+1)之间的弧为<Vi,V(k+1)>,则构造哈密顿路径V1, V2, …, Vi, V(k+1), V(i+1), …, V(k).若没找到满足条件的Vi,则说明对于所有的Vi(1<=i<=k)到V(k+1)的弧为<V(k+1),V(i)>,则构造哈密顿路径V(k+1), V1, V2, …, Vk.

证毕.

竞赛图构造哈密顿路时的算法同以上证明过程.

 

用图来说明:

假设此时已经存在路径V1 -> V2 -> V3 -> V4,这四个点与V5的连通情况有16种,给定由0/1组成的四个数,第i个数为0代表存在弧<V5,Vi>,反之为1,表示存在弧<Vi,V5>

sign[]={0, 0, 0, 0}.

很显然属于第二种情况,从后往前寻找不到1,即且不存在弧<Vi, V5>.

则构造哈密顿路:V5 -> V1 -> V2 -> V3 -> V4.

 

 

sign[]={0, 0, 0, 1}.

属于第一种情况,最后一个数字为1,即代表存在弧<Vi, V5>且i=4(最后一个点)

则构造哈密顿路: V1 -> V2 -> V3 -> V4 -> V5.

 

 

 

sign[]={0, 0, 1, 0}.

属于第二种情况,从后往前找到1出现的第一个位置为3.

构造哈密顿路: V1 -> V2 -> V3 -> V5 -> V4.

 

 

 

sign[]={0, 0, 1, 1}.

属于第一种情况,最后一个数字为1,即代表存在弧<Vi, V5>且i=4(最后一个点)

则构造哈密顿路: V1 -> V2 -> V3 -> V4 -> V5.

 

 

 

sign[]={0, 1, 0, 0}.

属于第二种情况,从后往前找到1出现的第一个位置为2.

构造哈密顿路: V1 -> V2 -> V5 -> V3-> V4.

 

 

 

sign[]={0, 1, 0, 1}.

属于第一种情况,最后一个数字为1,即代表存在弧<Vi, V5>且i=4(最后一个点)

则构造哈密顿路:V1 -> V2 -> V3 -> V4 -> V5.(就不举末尾为1的栗子了~~)

 

 

 

sign[]={1, 0, 1, 0}.

属于第二种情况,从后往前找到1出现的第一个位置为3.

构造哈密顿路: V1 -> V2 -> V3 -> V5-> V4.

 

 

 

sign[]={1, 1, 1, 0}.

属于第二种情况,从后往前找到1出现的第一个位置为3.

构造哈密顿路: V1 -> V2 -> V3 -> V5-> V4.

 

 

 

(还是举一个吧~~~)

sign[]={1, 1, 1, 1}.

同样最后一位为1,代表存在<Vi, V5>且i=4(最后一位)

则构造哈密顿路:V1 -> V2 -> V3 -> V4 -> V5.以上是当N=4时(N+1=5),用图来阐述算法的过程.

注意从后往前找不是找这个点编号之前的点,即不是按照编号来的,而是按照当前哈密顿序列从后往前找的.举个栗子:

4

2 1

1 3

3 2

4 1

4 2

4 3

第一步ans={1}

第二步ans={2,1}

第三步sign={0, 1}(map[3][2] = 0,map[3][1] = 1,当前序列为2,1) ,而不是{1, 0}(1,2),因为存在弧<V1, V3>和<V3, V2>.这里需要注意下.

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <bitset>
#include <unordered_map>
#include <unordered_set>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
#define HalF (l + r)>>1
#define lsn rt<<1
#define rsn rt<<1|1
#define Lson lsn, l, mid
#define Rson rsn, mid+1, r
#define QL Lson, ql, qr
#define QR Rson, ql, qr
#define myself rt, l, r
using namespace std;
typedef unsigned long long ull;
typedef unsigned int uit;
typedef long long ll;
const int maxN = 1e2 + 7;
int ans[maxN], mp[maxN][maxN], N;
inline void Insert(int &len, int l, int r)    //The ans[] length is len, insert key befor arv[index]
{len++;for(int i=r; i>=l; i--){ans[i + 1] = ans[i];}ans[l] = len;
}
void Hamilton()
{int have_node = 0;ans[++have_node] = 1;for(int i = 2; i <= N; i++) //插入点i{if(mp[ans[have_node]][i]) ans[++have_node] = i; //第一种情况,直接把当前点添加到序列末尾else{bool flag = false;for(int j = have_node - 1; j; j--)   //在当前序列中,从后往前找到第一个满足条件的点j,使得存在<Vj,Vi>且<Vi, Vj+1>.{if(mp[ans[j]][i])  //找到后把该点插入到序列的第j + 1个点前.{flag = true;Insert(have_node, j + 1, have_node);break;}}if(!flag) Insert(have_node, 1, have_node);    //否则说明所有点都邻接自点i,则把该点直接插入到序列首端.}}
}int main()
{int t; scanf("%d", &t);while(t--){scanf("%d", &N);memset(mp, 0, sizeof(mp));int M = N * (N - 1) / 2;for(int i = 0; i < M; i++){int u, v;scanf("%d%d", &u, &v);mp[u][v] = 1;}Hamilton();for(int i = 1; i <= N; i++) printf(i == 1 ? "%d":" %d", ans[i]);printf("\n");}return 0;
}

 


http://www.ppmy.cn/news/393237.html

相关文章

克罗内克积(Kronecker)

克罗内克积定义 克罗内克积是两个任意大小的矩阵间的运算&#xff0c;它是张量积的特殊形式。给定两个矩阵 A ∈ R m n \boldsymbol{A} \in \mathbb{R}^{m \times n} A∈Rmn和 B ∈ R p q \boldsymbol{B} \in \mathbb{R}^{p \times q} B∈Rpq&#xff0c;则这两个矩阵的克罗内…

NLP学习笔记十二-skip-gram模型求解

NLP学习笔记十一-skip-gram模型求解 上一篇文章&#xff0c;我们见到了skip-gram模型的原理&#xff0c;这里我们在陈述一下skip-gram模型其实是基于分布相似性原理来设计的&#xff0c;在skip-gram模型中&#xff0c;他认为一个词的内涵可以由他的上下文文本信息来概括&#…

连通性可预测深部脑刺激(DBS)对帕金森的疗效

深部脑刺激&#xff08;DBS&#xff09;对帕金森病&#xff08;PD&#xff09;的疗效可能取决于刺激部位与其他脑区之间的连通性&#xff0c;但是刺激哪些脑区&#xff0c;以及脑区间连通性是否能够预测患者的预后&#xff0c;仍然未知。在这里&#xff0c;我们确定了有效的DBS…

四甲基罗丹明二苯基环辛炔DBCO-TAMRA,TAMRA-DBCO,TAMRA DBCO与叠氮化合物通过无铜反应

英文名称:DBCO-TAMRA;TAMRA-DBCO 中文名称:四甲基罗丹明二苯基环辛炔 分子式&#xff1a;C54H57N5O10 分子量: 936.09 外观&#xff1a;深红色粉末 溶解性&#xff1a;DMSO, DMF, DCM, THF, Chloroform 纯度&#xff1a;>95% (HPLC) 结构式&#xff1a; 简介&#xf…

敏捷已死?

作者 | SCOTT MIDDLETON 译者 | 弯月 责编 | 王晓曼 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 敏捷运动从根本上改变了科技公司的运营方式&#xff0c;是Google、Facebook 和Airbnb 等一系列科技公司成功背后的核心推动力。然而&#xff0c;时隔二十年&…

5 Tamra Tyramide属于四甲基罗丹明 (TAMRA) 化物,5-四甲基罗丹明-酪酰胺

5-Tamra-Tyramide简述 TSA主要原理是利用酪胺Tyramide的过氧化物酶反应(酪胺盐在HRP催化H202下形成共价键结合位点)&#xff0c;产生大量的酶促产物 该产物能与周围的蛋白残基(包括色氨酸、组氨酸和酪氨酸残基)结合&#xff0c;这样在抗原-结合部位就有大量的生物素沉积&…

Maleimide-PEG-Amine,马来酰亚胺PEG氨基,MAL-PEG2k-NH2用于造影剂

Maleimide-PEG-Amine&#xff0c;马来酰亚胺PEG氨基&#xff0c;MAL-PEG2k-NH2用于造影剂 马来酰亚胺-PEG-胺(Mal-PEG-NH2)是一种线性异双功能PEG试剂&#xff0c;通常用作交联剂或两种不同化学实体之间的间隔物。 MAL-PEG-NH2(PEG分子量为2000 Da,MAL是6-(马来酰亚胺基)己酸琥…

20位顶级设计师的桌面环境

摘要 对一个设计师来说&#xff0c;用来办公的桌面环境的重要性远远超过其他行业&#xff0c;那么看看包括 Dribbble 联合创始人和 Twitter 设计师等在内的 20 位英、美顶尖设计师他们的桌面环境都是怎样的吧。 对设计师来说&#xff0c;其办公时间绝大部分都是在办公桌前&…