zoukankan      html  css  js  c++  java
  • 哈密尔顿环

    定义:

    指的是不重复走过所有的点。并且最后还能回到起点的路。


    简单的深度优先搜索就能求出一张图中所有的哈密尔顿环

      1 #include <iostream>
      2 #include <algorithm>
      3 #include <cstring>
      4 
      5 using namespace std;
      6 int start, length,x,n;
      7 const int maxn = 101;
      8 bool visited[maxn], v1[maxn];
      9 int ans[maxn], num[maxn];
     10 int g[maxn][maxn];
     11 void print()
     12 {
     13 	for (int i = 1; i <= length - 1; ++ i)
     14 	{
     15 		cout << ans[i] << " ";
     16 	}
     17 	cout << ans[length] << endl;
     18 }
     19 
     20 void dfs(int last, int i)//用数组模拟邻接表存储,访问点i,last标是上一个访问的点。 
     21 {
     22 	visited[i] = true;//比哦及为已经访问过的点 
     23 	vl[i] = true;//标记已经出现在一张图中点 
     24 	ans[++length] = i;//记录下答案 
     25 	for (int j = 1; j <= num[i]; ++ j)
     26 	{
     27 		if (g[i][j] == x && g[i][j] != last)//回到起点构成哈密顿环 
     28 		{
     29 			ans[++length] = g[i][j];
     30 			print();//这里说明找到了一个环 
     31 			length--;
     32 			break;
     33 		}
     34 		if (!visited[g[i][j]]) dfs[i] = false;
     35 	}
     36 	length--;
     37 	visited[i] = false;//这里是回溯 
     38 }
     39 
     40 int main()
     41 {
     42 	memset(visited, false, sizeof(visited));
     43 	memset(vl, false, sizeof(vl));
     44 	for (x = 1; x <= n; ++ x)//每个点都做为起点尝试访问,因为不是从任何一点开始都能找到过整个图。 
     45 	{
     46 		if (!vl[x])//如果点x没被之前的图访问过 
     47 		{
     48 			length = 0; //定义一个ans数组存答案,length记录长度 
     49 			dfs(0, x);
     50 		}
     51 	}
     52 	return 0;
     53 }
    追求吾之所爱
  • 相关阅读:
    ios 写项目的时候遇到的问题及解决方案(1)
    思绪锦集
    iOS学习-----真机测试过程
    StackOverflow程序员推荐的几本书籍
    关于算法学习的重要性
    程序的灵魂-算法
    C++ 之 const 随笔记
    Foundation 框架之——NSString、NSMutableString
    Objective-C之NSString和NSMutableString
    Objective-C之集合对象(NSSet,NSMutableSet,NSIndexSet)
  • 原文地址:https://www.cnblogs.com/rstz/p/14391081.html
Copyright © 2011-2022 走看看