这道题完全是使用的网上模版!自己根据定理来写的一直报WA。
哈密顿图
定义:经过图中每个顶点一次且仅一次的回路(通路)称为哈密回路(通路)
存在哈密顿回路的图称为哈密顿图


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=505;
int ans[maxn],g[maxn][maxn];
bool vis[maxn];
int n,m;
void init(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i==j){g[i][j]=0;}else{g[i][j]=1;}}}memset(vis,0,sizeof vis);
}void revese(int ans[],int s,int t)//将ans数组中s到t的部分倒置
{while(s<t){swap(ans[s],ans[t]);s++;t--;}
}void Hamilton(){int s=1,t;//初始化s取1号点int ansi=2;int i,j,w;for(i=1;i<=n;i++)if(g[s][i]) break;t=i;//取任意连接s的点为tvis[s]=vis[i]=true;ans[0]=s;ans[1]=t;while(true){while(true){//从t向外扩展for(i=1;i<=n;i++)if(g[t][i]&&!vis[i]){ans[ansi++]=i;vis[i]=true;t=i;break;}if(i>n)break;}//将当前得到的序列倒置,s和t互换,从t继续扩展,相当于在原来的序列上从s扩展w=ansi-1;i=0;revese(ans,i,w);swap(s,t);//从新的t向外扩展,相当于在原来的序列上从s向外扩展while(true){for(i=1;i<=n;i++)if(g[t][i]&&!vis[i]){ans[ansi++]=i;vis[i]=true;t=i;break;}if(i>n)break;}//如果s和t不相邻,进行调整if(!g[s][t]){for(i=1;i<ansi-2;i++)if(g[ans[i]][t]&&g[s][ans[i+1]])//取序列中一点i,使得ans[i]与t相连接且ans[i+1]与s相连break;//将从ans[i+1]到t部分的ans[]倒置w=ansi-1;i++;t=ans[i];revese(ans,i,w);}//如果当前s和t相连if(ansi==n)return;//如果当前序列中包含n个元素,算法结束//当前序列中的元素个数小于n,寻找点ans[i],使得ans[i]与ans[]外一点相连for(j=1;j<=n;j++){if(vis[j])continue;for(i=1;i<ansi-2;i++)if(g[ans[i]][j])break;if(g[ans[i]][j])break;}s=ans[i-1];t=j;revese(ans,0,i-1);//将ans[]中s到ans[i-1]部分的ans[]倒置revese(ans,i,ansi-1);//将ans[]中ans[i]到t的部分倒置ans[ansi++]=j;//将点j加入到ans[]的尾部vis[j]=true;}
}int main()
{while(scanf("%d%d",&n,&m)){if(n==0&&m==0)break;n<<=1;init();int a,b;while(m--){scanf("%d%d",&a,&b);g[a][b]=g[b][a]=0;}Hamilton();cout<<ans[0];for(int i=1;i<n;i++){cout<<" "<<ans[i];}cout<<endl;}return 0;
}

poj2438(哈密顿回路)相关推荐

  1. pat 食物链(状态压缩求哈密顿回路)

    状态压缩求哈密顿回路 #include<bits/stdc++.h> using namespace std; bool dp[23][1<<21]; char s[22][2 ...

  2. 1122 Hamiltonian Cycle (25 分)【难度: 一般 / 知识点: 模拟 哈密顿回路】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805351814119424 本题考察的就是哈密顿回路 只能走n+1步 有 ...

  3. [蓝桥杯]算法训练 The Red Button||codeforces 325E(哈密顿回路)

    问题描述 Piegirl终于发现了红色按钮,你现在还剩最后一个机会去改变这个结局.这个按钮下面的电路由n个从0到n-1编号节点组成.为了关闭这个按钮,这n个节点必须以特定的序列拆解.节点0必须首先拆解 ...

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

    本文链接:http://www.cnblogs.com/Ash-ly/p/5452580.html 概念: 哈密顿图:图G的一个回路,若它通过图的每一个节点一次,且仅一次,就是哈密顿回路.存在哈密顿回 ...

  5. 没有哈密瓜只有哈密顿----图论之哈密顿回路

    老规矩,先来百度一下 哈密顿图(哈密尔顿图)(英语:Hamiltonian graph,或Traceable graph)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其 ...

  6. 关于旅行商,哈密顿回路和NP问题的科普

    哈密顿回路 哈密顿图(哈密尔顿图)(英语:Hamiltonian graph,或Traceable graph)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只 ...

  7. POJ-2438 哈密顿环 哈密瓜很甜

    无向图经过所有的节点一次且仅一次:哈密瓜路径 无向图经过所有的边一次且仅一次:欧拉路径 带权哈密顿路径就是旅行商问题. 参考博客:https://blog.csdn.net/zhouzi2018/ar ...

  8. PAT甲级真题1122 哈密顿回路(详解)

    哈密顿回路问题是找到一个包含图中每个顶点的简单回路. 这样的回路称为"哈密顿回路". 在本题中,你需要做的是判断给定路径是否为哈密顿回路. 输入格式 第一行包含一个整数 NN 表示 ...

  9. 【题解】【AcWing】1615. 哈密顿回路

    1615. 哈密顿回路 原题传送:AcWing 1615. 哈密顿回路 哈密顿回路问题是找到一个包含图中每个顶点的简单回路. 这样的回路称为"哈密顿回路". 在本题中,你需要做的是 ...

最新文章

  1. 【解决方案】VS2017读取文件中文乱码,其他软件打开却没事
  2. jdk中自带 jstat,jconsole,jps,jmap,jhat使用
  3. php 时分秒选择联动,微信小程序-年月日时分秒六级联动时间选择器
  4. rhel系统启动过程_Linux启动过程详解
  5. 《Python程序设计》在亚马逊京东当当互动出版网淘宝全面上架
  6. Android Studio 3.4升级后的运行问题解决办法
  7. JS生成随机的字母数字组合的字符串
  8. 2011年度IT博客大赛 “博”乐大行动(已结束)
  9. c语言:新颖的进制灵活应用
  10. 计算机组成和体系结构电子版,计算机组成及体系结构-安建峰.pdf
  11. CMD中可执行的结束进程命令
  12. 今晚直播 | 手把手带你用 Three.js 实现粒子特效,走入 3D 世界!
  13. 性能优化实战-sql递归查询效率低下
  14. 操作系统的基本类型、工作流程及其优缺点
  15. 技术问答-18 设计模式
  16. ios html背景音乐,iOS音频篇:使用AVPlayer播放网络音乐
  17. 为什么PDF文件无法编辑?
  18. 【socket】socket编程总目录
  19. 2020最流行的React组件库推荐
  20. JSON转化成Excel文件

热门文章

  1. 网络空间安全:社会工程学之信息追踪——学习笔记 利用搜索引擎追踪!
  2. 一文图解卡尔曼滤波(Kalman Filter)
  3. java B2B2C Springcloud多租户电子商城系统-(七)高可用的分布式配置中心(Spring Cloud Config)...
  4. 微信小程序获取页面栈
  5. .NET/C#中对自定义对象集合进行自定义排序的方法
  6. onCompositionStart与compositionend
  7. Confluence5.1 最新版的安装破解汉化
  8. Nginx 静态资源缓存配置
  9. Javascript正则匹配不含某子串
  10. Java NIO使用及原理分析(三)