哈密尔顿环

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 int start,length,x,n;
 5 bool visited[101],v1[101];
 6 int ans[101], num[101];
 7 int g[101][101];
 8 void print() {
 9     int i;
10     for (i = 1; i <= length; i++)
11         cout << ‘ ‘ << ans[i];
12     cout << endl;
13 }
14 void dfs(int last,int i)
15 //访问点i,last表示上次访问的点
16 {
17     visited[i] = true;        //标记为已经访问过
18     v1[i] = true;           //标记为已在一张图中出现过,不用回溯
19     ans[++length] = i;                //记录下答案
20     for (int j = 1; j <= num[i]; j++)
21     {
22         if (g[i][j]==x &&  g[i][j]!=last)
23         { //回到起点,构成哈密尔顿环
24             ans[++length] = g[i][j];
25             print();           //这里说明找到了一个环,则输出ans数组。
26             length--;
27             break;
28         }
29         if (!visited[g[i][j]]) dfs(i,g[i][j]);//遍历与i相关联所有未访问过的顶点
30     }
31     length--;
32     visited[i] = false;       //这里是回溯过程,注意v1的值不恢复。
33 }
34 int main() {
35     cin>>n;
36     int m;
37     cin>>m;
38     for(int i=1; i<=m; i++) {
39         int x,y;
40         cin>>x>>y;
41         g[x][++num[x]]=y;//此x点能够通往几条边,边
42         g[y][++num[y]]=x;//此y点能够通往几条边,边
43     }
44     for (x = 1; x <= n; x++)
45         //每一个点都作为起点尝试访问,因为不是从任何一点开始都能找过整个图的
46         if (!v1[x]) {            //如果点x不在之前曾经被访问过的图里。
47             length = 0;      //定义一个ans数组存答案,length记答案的长度。
48             dfs(0,x);
49         }
50     return 0;
51 }
时间: 2024-08-13 15:34:12

哈密尔顿环的相关文章

哈密尔顿环问题

哈密尔顿环 欧拉回路是指不重复地走过所有路径的回路,而哈密尔顿环是指不重复地走过所有的点,并且最后还能回到起点的回路. 1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int num[10001];//求一个点能过到达的边的数量 5 int map[1001][1001]; 6 int jztx[1001]; 7 int vis[1001]; 8 int now=1; 9 int ans[1001];

哈密尔顿环x

欧拉回路是指不重复地走过所有路径的回路,而哈密尔顿环是指不重复地走过所有的点,并且最后还能回到起点的回路. 代码如下: #include<iostream> #include<cstring> using namespace std; const int Maxn=1001; int start,lengt,x,n; bool visited[Maxn],v1[Maxn]; int ans[Maxn],num[Maxn]; int g[Maxn][Maxn]; void print

【算法】欧拉(回)路与哈密尔顿环

概念 "哈密尔顿回路问题"是访问除原出发结点以外的每个结点一次且仅一次,而"欧拉回路问题"是访问每条边一次且仅一次 欧拉回路与欧拉路 PS:已经判断此图有欧拉路或欧拉回路 #include<iostream> using namespace std; int g[101][101]; int du[101]; int lu[101]; int n,e,l,start,x,y; int maxn,minn=99999; int find(int i) {

哈密尔顿环 dfs

( ⊙ o ⊙ ) 题目: (⊙v⊙)嗯,代码: 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 const int N = 25; 6 int n, cnt; 7 int a[N][N]; 8 int v[N], p[N]; 9 10 void print(){ 11 printf("Route #%d: ", ++cnt);//路径条数 12 for(int i=1;

poj 2288 Islands and Bridges_状态压缩dp_哈密尔顿回路问题

题目链接 题目描写叙述:哈密尔顿路问题.n个点,每个点有权值,设哈密尔顿路为 C1C2...Cn,Ci的权值为Vi,一条哈密尔顿路的值分为三部分计算: 1.每个点的权值之和2.对于图中的每一条CiCi+1,加上Vi*Vi+1 3.对于路径中的连续三个点:CiCi+1Ci+2,若在图中,三点构成三角形,则要加上Vi*Vi+1*Vi+2 求一条汉密尔顿路能够获得的最大值,而且还要输出有多少条这种哈密尔顿路. 这道题的状态感觉不是非常难想,由于依据一般的哈密尔顿路问题,首先想到的是设计二维状态,dp[

哈密尔顿道路与哈密尔顿回路

简介 1857年爱尔兰数学家哈密尔顿发明了"周游世界"玩具,用一个正十二面体的20个顶点表示世界上20个大城市,30条棱代表这些城市之间的道路.要求游戏者从任意一个城市(即顶点)出发,延棱行走经过每个城市一次且只经过一次,最终返回出发地.哈密尔顿将此问题称为周游世界问题,并且作了肯定的回答. 以下是一种走法 与之等价的可以做成平面图,按这个编号走是可行的 哈密尔顿道路与哈密尔顿回路 哈密尔顿道路:通过图G中每个顶点一次且仅一次的道路称作该图的一条哈密尔顿道路. 哈密尔顿回路:通过图G中

图像处理中的数学原理详解(Part7) ——哈密尔顿算子

全文目录请见 图像处理中的数学原理详解(Part1 总纲) http://blog.csdn.net/baimafujinji/article/details/48467225 在前面的部分中我们已经完整地给出了梯度和散度这些数学概念的意义,这些生涩的定义在最初学习的时候很少有人会注意到它们跟图像能有什么联系.然而,随着学习的深入,当真正接触到图像处理算法时,你又不得不承认,梯度.散度这些东西几乎是无处不在的.本节所介绍的内容就是这些概念在图像处理中的最最简单应用之范例.这部分内容与边缘检测技术

POJ 2288 Islands and Bridges 哈密尔顿路 状态压缩DP

找最长的其实是很裸的状态压缩DP,棘手的地方是要统计数量,其实只要再来一个数组存就好. 不过代码比较长,细节要注意的地方毕较多,wa了很多发,还是要仔细啊 用递推和记忆化搜索分别写了一遍 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <

旅行商问题(TSP)、最长路径问题与哈密尔顿回路之间的联系(归约)

一,旅行商问题与H回路的联系(H回路 定义为 哈密尔顿回路) 旅行商问题是希望售货员恰好访问每个城市一次,最终回到起始城市所用的费用最低,也即判断图中是否存在一个费用至多为K的回路.(K相当于图中顶点的个数) 由于售货员可以从某个城市到其他任何一个城市.因此,该问题对应的是一个完全图(设为G′).而关于判断哈密尔顿回路的图(设为G)并不一定为完全图,因此,在将哈密尔顿回路问题归约到旅行商问题时,定义一个费用函数(详情参考<算法导论第二版中文版>第626页. 通过这个费用函数,将判断G′是否存在