首页 > 其他分享 >DFS求旅行商问题

DFS求旅行商问题

时间:2022-09-23 13:12:37浏览次数:49  
标签:disp 旅行 tem int create DFS 问题 void dis

设有城市1.2.3.4,求从1出发,不重复地经过4个城市且最终返回城市1的最短路径
问题分析:
将该题转为加权图模型,尝试所有可行路线,并比较得出最短路径。

#include<iostream>
#define M 10
#define N 10
using namespace std;

int dis[M][N];
int ans =100;
int n;
int a[5];
void create()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {

            int tem;
            cin>>tem;
            dis[i][j]=tem;
            //cin>>mtx[i][j];
            dis[j][i]=dis[i][j];
        }
    }
}
void disp(int n){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cout<<dis[i][j]<<"\t";
        }
        cout<<endl;
    }
}

//搜索的路径为中间三个,头和尾都为城市1 
void dfs(int* a,int len,int num,int u)
//数组记录礼金城市的顺序,len记录总距离,num记录经过城市个数
//u表示当前在那个城市
{
    if(num==n)
    {
        if(dis[u][1]==-1) return;//值为说明此路不通
        len+=dis[u][1];           //否则累加距离
        ans=min(ans,len);         //并将该累加值与最终结果比较
        return;
    }
    for(int i=2;i<=n;i++)       //依次以城市2. 3 .4,为第一站开始搜索
    {
        int flg = 0;
        for(int j=1;j<=num;j++)
        {
            if(a[j]==i)
            {
                flg=1;          //排除已经经过该城市的情况
                break;
            }
        }
        if(!flg && dis[u][i]!=-1)   //该边可以走并且没有走过
        {
            a[num+1] = i;
            dfs(a,len + dis[u][i],num+1,i);//记录该站并继续搜索
        }
    }
}
int main(){
    //freopen("C:\\in.txt","r",stdin);
    //int n;
    cin>>n;
    create();
    disp(n);
    dfs(a,0,1,1);
    for(int i=2;i<=n;i++)
        cout<<a[i]<<"  ";
    cout<<endl;
    cout<<ans;
}
/*
4
-1 4 -1 5
4 -1 -1 7
-1 -1 -1 3
5 7 3 -1

4
-1 5 3 4
5 -1 7 6 
3 7 -1 -1
4 6 -1 -1
*/

复杂度:
O(n!)

标签:disp,旅行,tem,int,create,DFS,问题,void,dis
From: https://www.cnblogs.com/vvvv214/p/16722355.html

相关文章

  • Mysql查询无结果返回值问题
    Mysql查询无结果返回值问题执行下面sql语句SELECTCustomerIDFROMcustomerWHERECustomerID=10;运行结果:什么是N/A?N/A:NotAvailableORNotApplicable......
  • 前 30 个 Python 面试问题和实践答案
    前30个Python面试问题和实践答案[](https://click.linksynergy.com/deeplink?id=CuIbQrBnhiw&mid=39197&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2F100-days-of......
  • 记录Windows下安装beego遇到的问题
    一、安装步骤1.任何位置创建一个文件夹2.cmd方式进入创建的文件夹、或者使用Golang编辑器打开(我就是用Golang打开的)3.在编辑器的命令行下依次输入如下代码#初始化项......
  • devexpress过期问题
    有时候dev插件破解后,仍然会直接在已生成的控件上显示Yourtrailperiodhasbeenexpired字样,简单修改一下注册表可以延长期限,步骤如下:1.打开注册表(cmd-regedit)2.找到HKE......
  • ES6 添加 'let' 属性而不是函数闭包来解决问题
    ES6添加'let'属性而不是函数闭包来解决问题首先,了解ES6的let关键字和var的区别。let和var的区别:var没有块作用域,而let有块作用域。在JavaScript中,......
  • 清除定时器setInterval 问题
    前置条件:在A页面加了一个check选择,需要自动刷新请求接口;然后在未取消自动刷新时跳转了其他页面后再次回到A页面去清理掉定时器。<el-checkboxv-model="checked"@chan......
  • uniapp学习笔记-transition过渡动画切换卡顿的问题
    //主页分页面1分页面2 发现从主页跳转到1和2页面不存在动画卡顿,不过1和2之间切换存在卡顿,猜测可能是动画都是zoomin个人探索的解决方法:先切换到......
  • Flutter小问题及其解决方案
    本文章随缘更新,希望对你有帮助。1.使用InkWell包裹的组件作为ListView的子组件会溢出我们有以下界面ListView.builder(padding:constEdgeInsets.all(16.0),it......
  • Windows10内置Linux子系统(WSL)Vmmem内存占用过大问题
    按下Windows+R键,输入%UserProfile%并运行进入用户文件夹新建文件.wslconfig,然后记事本编辑输入以下内容并保存,memory为系统内存上限,这里我限制最大2gb[wsl2......
  • 解决Ubuntu下的的“system program problem detected”问题
    解决Ubuntu下的的“systemprogramproblemdetected”问题1.删除crash文件sudorm/var/crash/*2.关闭popup功能sudogedit/etc/default/apport将其中enable=1该......