#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,那么队尾记
哈密尔顿回路
最新推荐文章于 2025-06-19 10:37:03 发布