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

     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 }
  • 相关阅读:
    Docker篇章1:Docker介绍
    flask-restful结合vue自定义错误类型
    9.Go语言-函数
    8.Go语言-流程控制
    7.Go语言-结构体
    6.Go语言-指针
    5.Go语言-map类型
    计算机组成原理笔记2-数制、字符、校验码、定点数、浮点数、算术逻辑单元
    计算机组成原理笔记1--基础概念丶性能指标
    计算机网络笔记2--物理层
  • 原文地址:https://www.cnblogs.com/lyqlyq/p/6683126.html
Copyright © 2011-2022 走看看