zoukankan      html  css  js  c++  java
  • 哈密顿环求解 C++实现 回溯法

    /*  函数功能:求解哈密顿环(无向图,有向图请自改)问题,输出全部不相同的环,即经过图中每个结点并且只经过一次的可行解。 
     *  作者    :王宇虹 
     *  时间    :2015年5月21日  13:23:00.000
     *  编译环境:Dev-C++ 5.8.3
     */
    #include<iostream>
    #include<cstring>
    using namespace std;
    int n,m,g,i;  //n表示无向图中结点个数,g表示结点关系个数 
    int a[10000][10000];  //只开到结点个数为10000的范围
    void NextValue(int k,int* x); 
    void Hamiltonian(int k,int *x);
    void Hamiltonian(int *x);
    
    int main()      //主函数
    {
    	memset(a,0,sizeof(a)); 
    	cout << "请输入无向图中结点的个数: ";
    	cin >> n;
    	cout << "请输入边的条数: ";
    	cin >> g;
    	int *x = new int[10000];
        int u, v;
        for(i = 0; i < n; i++) x[i] = 0;
        for(i = 0; i < g; i++)
    	{
    		cout << "请输入边:";
    		cin >> u >> v;
    	    a[u][v] = a[v][u] = 1;
    	}
    	cout << "可行解: " << endl; 
    	Hamiltonian(x);
    
        return 0;
    }
    
    void NextValue(int k,int* x)
    {
    	int j;
        do{
    		x[k] = (x[k]+1) % n;    		 	//下一个结点编号 
    		if(!x[k]) return;         		 
    		    if(a[x[k-1]][x[k]]){              //(x[k-1],x[k])是否是图中一条边 
    		    for(j = 0; j < k; j++)      //检查与前k个节点是否相同
    		        if(x[j] == x[k])	break;  //结点x[k]与前k个结点有重复 
    		    if(j == k)                      //x[k]是当前可取的结点编号 
    		        if((k < n-1)||(k == n-1) && a[x[n-1]][x[0]])
    			      return;
    			}
    	}while(1);
    }
    void Hamiltonian(int k,int *x)
    {
    	do{
    		NextValue(k, x);             //产生x[k]的下一个值 
    		if(!x[k])  return;               //x[k]=0表示x[k]已经没有可取值 
    		if(k == n - 1) {                //输出一个哈密顿环 
    			for(int i = 0; i < n; i++)  cout<<x[i]<<' ';
    			cout<< "0
    ";
    		}
    		else
    			Hamiltonian(k+1,x);         //深度优先进入下一层 
    	}while(1);
    }
    void Hamiltonian(int *x)
    {
    	Hamiltonian(1, x);
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Linux ping 命令
    Linux ab 命令
    存储过程统计年月日的访问人数
    Struts Upload上传文件
    struts json登录
    javaScript没有块级作用域
    ThreadLocal(一):Thread 、ThreadLocal、ThreadLocalMap
    BeanUtils 学习教程
    WeakHashMap 理解笔记
    javaScript中的单引号与双引号
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965382.html
Copyright © 2011-2022 走看看