bool v[maxn];
vector<int> ans;
bool maze[maxn][maxn];
void Hamilton(int n) {
ans.clear();
int s = 1 , t;
int i , j;
M(v);
for(i = 1; i <= n; ++i)
if(maze[s][i])
break;
t = i;
v[s] = v[t] = 1;
ans.pb(s);
ans.pb(t);
while(1) {
while(1) {
for(i = 1 ; i <= n ; ++i){
if(maze[t][i] && !v[i]) {
ans.pb(i);
v[i] = 1;
t = i;
break;
}
}
if(i > n) break;
}
reverse(all(ans));
swap(s , t);
while(1) {
for(i = 1; i <= n; ++i) {
if(maze[t][i] && !v[i]) {
ans.pb(i);
v[i] = 1;
t = i;
break;
}
}
if(i > n) break;
}
if(!maze[s][t]) {
for(i = 1; i <= ans.size() - 2; ++i) {
if(maze[ans[i]][t] && maze[s][ans[i + 1]])
break;
}
i++;
t = ans[i];
reverse(ans.begin() + i , ans.end());
}
if(ans.size() == n)
return;
for(j= 1; j <= n; ++j) {
if(v[j]) continue;
for(i = 1; i < ans.size() - 2; ++i) {
if(maze[ans[i]][j]) break;
}
if(maze[ans[i]][j]) break;
}
s = ans[i - 1];
t = j;
reverse(ans.begin() , ans.begin() + i);
reverse(ans.begin() + i ,ans.end());
ans.pb(j);
v[j] = 1;
}
return;
}
哈密顿回路
最新推荐文章于 2022-10-13 10:42:34 发布