poj2438(哈密顿回路)
这道题完全是使用的网上模版!自己根据定理来写的一直报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(哈密顿回路)相关推荐
- pat 食物链(状态压缩求哈密顿回路)
状态压缩求哈密顿回路 #include<bits/stdc++.h> using namespace std; bool dp[23][1<<21]; char s[22][2 ...
- 1122 Hamiltonian Cycle (25 分)【难度: 一般 / 知识点: 模拟 哈密顿回路】
https://pintia.cn/problem-sets/994805342720868352/problems/994805351814119424 本题考察的就是哈密顿回路 只能走n+1步 有 ...
- [蓝桥杯]算法训练 The Red Button||codeforces 325E(哈密顿回路)
问题描述 Piegirl终于发现了红色按钮,你现在还剩最后一个机会去改变这个结局.这个按钮下面的电路由n个从0到n-1编号节点组成.为了关闭这个按钮,这n个节点必须以特定的序列拆解.节点0必须首先拆解 ...
- 哈密顿图 哈密顿回路 哈密顿通路(Hamilton)
本文链接:http://www.cnblogs.com/Ash-ly/p/5452580.html 概念: 哈密顿图:图G的一个回路,若它通过图的每一个节点一次,且仅一次,就是哈密顿回路.存在哈密顿回 ...
- 没有哈密瓜只有哈密顿----图论之哈密顿回路
老规矩,先来百度一下 哈密顿图(哈密尔顿图)(英语:Hamiltonian graph,或Traceable graph)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其 ...
- 关于旅行商,哈密顿回路和NP问题的科普
哈密顿回路 哈密顿图(哈密尔顿图)(英语:Hamiltonian graph,或Traceable graph)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只 ...
- POJ-2438 哈密顿环 哈密瓜很甜
无向图经过所有的节点一次且仅一次:哈密瓜路径 无向图经过所有的边一次且仅一次:欧拉路径 带权哈密顿路径就是旅行商问题. 参考博客:https://blog.csdn.net/zhouzi2018/ar ...
- PAT甲级真题1122 哈密顿回路(详解)
哈密顿回路问题是找到一个包含图中每个顶点的简单回路. 这样的回路称为"哈密顿回路". 在本题中,你需要做的是判断给定路径是否为哈密顿回路. 输入格式 第一行包含一个整数 NN 表示 ...
- 【题解】【AcWing】1615. 哈密顿回路
1615. 哈密顿回路 原题传送:AcWing 1615. 哈密顿回路 哈密顿回路问题是找到一个包含图中每个顶点的简单回路. 这样的回路称为"哈密顿回路". 在本题中,你需要做的是 ...
最新文章
- 【解决方案】VS2017读取文件中文乱码,其他软件打开却没事
- jdk中自带 jstat,jconsole,jps,jmap,jhat使用
- php 时分秒选择联动,微信小程序-年月日时分秒六级联动时间选择器
- rhel系统启动过程_Linux启动过程详解
- 《Python程序设计》在亚马逊京东当当互动出版网淘宝全面上架
- Android Studio 3.4升级后的运行问题解决办法
- JS生成随机的字母数字组合的字符串
- 2011年度IT博客大赛 “博”乐大行动(已结束)
- c语言:新颖的进制灵活应用
- 计算机组成和体系结构电子版,计算机组成及体系结构-安建峰.pdf
- CMD中可执行的结束进程命令
- 今晚直播 | 手把手带你用 Three.js 实现粒子特效,走入 3D 世界!
- 性能优化实战-sql递归查询效率低下
- 操作系统的基本类型、工作流程及其优缺点
- 技术问答-18 设计模式
- ios html背景音乐,iOS音频篇:使用AVPlayer播放网络音乐
- 为什么PDF文件无法编辑?
- 【socket】socket编程总目录
- 2020最流行的React组件库推荐
- JSON转化成Excel文件
热门文章
- 网络空间安全:社会工程学之信息追踪——学习笔记 利用搜索引擎追踪!
- 一文图解卡尔曼滤波(Kalman Filter)
- java B2B2C Springcloud多租户电子商城系统-(七)高可用的分布式配置中心(Spring Cloud Config)...
- 微信小程序获取页面栈
- .NET/C#中对自定义对象集合进行自定义排序的方法
- onCompositionStart与compositionend
- Confluence5.1 最新版的安装破解汉化
- Nginx 静态资源缓存配置
- Javascript正则匹配不含某子串
- Java NIO使用及原理分析(三)