zoukankan      html  css  js  c++  java
  • 哈密尔顿环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()
    {
        int i;
        for (i=1;i<=lengt;i++)
            cout<<ans[i]<<' ';
        cout<<endl;
    }
    
    void dfs(int last,int i)
    {//访问点i,last表示上次访问的点
        visited[i]=1;//标记为已经访问过       
        v1[i]=1;//标记为已在一张图中出现过
        ans[++lengt]=i;//记录下答案          
        for (int j=1;j<=num[i];j++) 
        {//x为记录的第几个数 
            if (g[i][j]==x&&g[i][j]!=last) {//回到起点,构成哈密尔顿环 
                ans[++lengt]=g[i][j];
                print();//如果找到了一个环,则输出ans数组  
                lengt--;
                break;
            }
            if (!visited[g[i][j]]) dfs(i,g[i][j]);//遍历与i相关联所有未访问过的顶点
        }
        lengt--;
        visited[i]=0;//回溯,但需要注意的是v1的值不恢复    
    }
    
    int main() {
        cin>>n;
        int m;
        cin>>m;
        for(int i=1;i<=m;i++) {
            int x,y;
            cin>>x>>y;
            g[x][++num[x]]=y;//表示x所对的第几个出度所指的数为y,说明xy之间能够“行走” 
            g[y][++num[y]]=x;//同上 
        }
        for(x=1;x<=n;x++)
    //每一个点都作为起点尝试访问,因为不是从任何一点开始都能找过整个图的
            if (!v1[x]) {//如果点x不在之前曾经被访问过的图里面的话
                lengt=0;//定义一个ans数组存答案,lengt记答案的长度
                dfs(0,x);
            }
        return 0;
    }

    如果运气好也是错,那我倒愿意错上加错!

    ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 相关阅读:
    随笔53 java存在继承关系的类之间的调用
    Servlet 与 CGI 的比较
    Angularjs导出数据到Excel
    JavaScript获得当前月份起止日期
    const与let
    JS判断浏览器类型及版本号(Web端)
    JSON怎么添加注释
    CSS中的特殊的选择器
    CSS界面友好显示的小技巧
    CSS3使用弹性盒子模型定义布局
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/6683044.html
Copyright © 2011-2022 走看看