哈密尔顿回路

哈密尔顿回路是图论中的一个重要概念,它是指在一个无向图中找到一条经过每个顶点恰好一次并返回起点的路径。这篇博客深入探讨了哈密尔顿回路的定义、性质以及求解算法,包括著名的旅行商问题与哈密尔顿回路的关系,还介绍了用于寻找哈密尔顿回路的染色定理和最小生成树等图论工具。对于图论爱好者和算法研究者来说,理解哈密尔顿回路对于优化问题的解决具有重要意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<bits/stdc++.h>
#define maxn 1000
using namespace std;
int n, nex[maxn+3], mp[maxn+3][maxn+3];//N个点,NEX存路径,MP邻接阵
bool expend(int s){
    memset(nex, -1, sizeof(nex));
    int head = s, tail = s;//当前路径首尾都是S,路径视作队列
    for(int i=0; i<n; ++i){//逐个点扫一次
        if(i==s) continue;//如果I是起始点S就跳过
        if(mp[i][head]){//如果当前点到h点有边
            nex[i] = head;//则i点指向h点
            head = i;//队首改为当前扫到的点i
        }
        else{//注意:如果I点到h点无边,那就是说,H点是一定到I点有边的
            int x = head, y = nex[head];//读出队首和队首的下一结点
            while(y != -1 && mp[y][i]){//队首下一结点已更新且到i点有边
                x = y;//这轮的Y变成下一轮的X
                y = nex[y];//这轮Y的NEX点变成下一轮的Y
            }
            //若y的NEX数组未更新(-1),当前X未更新NEX数组就把X的NEX记为I,然后I记为-1
            //如果y的NEX数组已更新,但mp[y][i]不存在,那么一定存在i到Y的边
            nex[x] = i;//X从一进来的HEAD到往后递推停止一直都是有边指向I
            nex[i] = y;//Y即X的NEX无论是否已更新都记为i的NEX,只不过是-1就更新一下队尾
            if(y == -1)tail = i;//如果Y是-1,那么队尾记
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值