哈密尔顿环
来源:互联网 发布:控制网络流量软件 编辑:程序博客网 时间:2024/06/12 00:16
欧拉回路是指不重复的走过所有路径的回路,而哈密尔顿环是指不重复地走过所有的点,并且最后还能回到起点的回路。使用简单的深度优先搜索,就能求出一张图中所有的哈密尔顿环,下面给出一段参考程序:
#include <iostream>#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <iomanip>#include <vector>using namespace std;int start,length,x,n;bool visited[101],v1[101];int ans[101],num[101];int g[101][101];void print(){ int i; for(i=1;i<=length-1;i++)cout<<ans[i]<<' '; cout<<ans[length]<<endl;}void dfs(int last,int i) //图用数组模拟邻接表存储,访问点i,last表示上次访问的点{ visited[i]=1; //标记为已经访问过 v1[i]=1; //标记为已在一张图中出现过 ans[length++]=i; //记录下答案 for(int j=1;j<=num[i];j++) { if(g[i][j]==x&&g[i][j]!=last){ //回到起点构成哈密顿环 ans[++length]=g[i][j]; print(); //这里说明找到了一个环,则输出ans数组 length--; break; } if(!visited[g[i][j]])dfs(i,g[i][j]); //遍历与i相关联的所有未访问的点。 } length--; visited[i]=0;//回溯的过程,注意v1不能回溯}int main(){ memset(visited,0,sizeof(visited)); memset(v1,0,sizeof(v1)); cin>>n; int m;cin>>m; for(int i=1;i<=m;i++){ int x,y; cin>>x>>y; g[x][++num[x]]=y; g[y][++num[y]]=x; } for(x=1;x<=n;x++) //每一个点都作为起点来尝试访问,因为不是从任何一点开始都能找过整个图 { if(!v1[x]) //如果点x不在之前曾经被访问过的图里 { length=0; //定义一个ans数组存答案,length记答案的长度 dfs(0,x); } } return 0;}
阅读全文
1 0
- 哈密尔顿环
- 哈密尔顿环
- hdu 2181(哈密尔顿环)
- 一笔画与哈密尔顿环
- Tour-Guide解题报告 - 哈密尔顿环问题
- 哈密尔顿环(图论算法)
- 哈密尔顿回路
- 哈密尔顿回路
- 求出所有哈密尔顿图
- 哈密尔顿回路 C++
- 哈密尔顿回路问题
- 【小程序】哈密尔顿距离
- 哈密尔顿环路问题
- 【哈密尔顿图】目录
- 马的哈密尔顿链
- [c++,algorithm] 哈密尔顿回路判断
- ZJU2100 Seeding - 哈密尔顿通路 深度优先搜索
- “欧拉回路”与“哈密尔顿回路”
- android Notification简单用法
- R语言-日期/时间
- Bug2
- leetcode--Populating Next Right Pointers in Each Node
- 如何用JS求DOM树的最大深度?
- 哈密尔顿环
- 链表+启发式合并(bzoj 1483: [HNOI2009]梦幻布丁)
- 转:kettle中调度kitchen.bat后面接参数,写定时更新任务
- Maven的生命周期
- java配置环境变量
- 阿里云移动推送iOS
- Apache Log4j配置说明
- MongDB安装windows平台
- Mysql 获取一个表中字段信息存入另一个表中