旅行商问题算法流程图及时间复杂度

问题描述

旅行商问题算法流程图及时间复杂度

#include "iostream"
using namespace std;
int fact(int n)
{ //阶乘函数
int x = 1;
for(int i=n;i>0;i--)
x*=i;
return x;
}
void perm(int n,FILE *fp)
{
int i,b,k;
int *fa = new int[n+1]; //保存阶乘结果
int *r = new int[n],*r2 = new int[n];
int*num = new int[n];
//r 计算逆序数;r2计算对应位数;num保存排列结果
int tot = 0;
for ( i=0;i<n+1;i++)
fa[i] =fact(i);
fp=fopen("data.txt","wb");
for (int count=0;count<fa[n];count++)
{
//一共n!个排列,对每个数,计算其对应的序列

    tot = count; //r,r2 保存变进制数结果,即对应的逆序数组
    for (b=n-1;b>=1;b--)
    {
        r2[n-1-b] = r[n-1-b] = tot/fa[b];
        tot = tot % fa[b];
    }
    r[n-1] = r2[n-1] = 0;
    //根据逆序数,计算每个数字所在位数
    for ( b=1;b<n-1;b++)
    {
        for ( k=b-1;k>=0;k--)
        {
            if(r[k]<=r[b])
                r2[b] ++;
        }
    }
    for ( i=0;i<n-1;i++) {
        r2[n-1] += (i+1 - r2[i]);
    }
    //根据位数计算出排列
    for ( i=0;i<n;i++)
    {
        num[r2[i]] = i+1;
    }
    for(i=0;i<n;i++)
        fprintf(fp,"%d ",num[i]);
    fprintf(fp,"
");
}
fclose(fp);

}
void travel(int **dis,int n,int m,FILE fp,int beginIndex)
{
int k=0,i;
int curdis;
int Mindis=10000;
int **help=new int
[fact(n)];
for(i=0;i<fact(n);i++)
help[i]=new int[n];
fp = fopen("data.txt","rb");
while(k<fact(n))
{
curdis=0;
for(i=0;i<n;i++)
{
fscanf(fp,"%d",&help[k][i]);

}
if(help[k][0]==beginIndex)
{
for(i=0;i<n-1;i++)
{
curdis += dis[help[k][i]-1][help[k][i+1]-1];
}
curdis += dis[help[k][i]-1][help[k][0]-1];
if(curdis<Mindis)
{
Mindis=curdis;
}
}
k++;
}
cout<<Mindis<<endl;
fclose(fp);

k=0;
fp = fopen("data.txt","rb");
while(k<fact(n))
{
    curdis = 0;
    for(i=0;i<n;i++)
    {
        fscanf(fp,"%d",&help[k][i]);
    }
    if(help[k][0]==beginIndex)
    {
        for(i=0;i<n-1;i++)
            curdis += dis[help[k][i]-1][help[k][i+1]-1];
        curdis += dis[help[k][i]-1][help[k][0]-1];
        if(curdis==Mindis)
        {
            for(i=0;i<n;i++)
                printf("%d ",help[k][i]);
            printf("%d
",beginIndex);
        }
    }
     k++;
}
fclose(fp);

}
int main()
{
int n,i,j,beginIndex;
cout<<"请输入城市个数:";
cin>>n;
cout<<"从第几个城市出发:";
cin>>beginIndex;
int **dis=new int*[n];
for(i=0;i
dis[i]=new int[n];
cout
for(i=0;i
for(j=0;j
cin>>dis[i][j];
FILE *fp;
perm(n,fp);
travel(dis,n,n,fp,beginIndex);
return 0;
}

这是用穷举法解决旅行商问题的算法,跪求大神来份流程图和时间复杂度怎么算?谢大神!

解决方案

算法之时间复杂度和空间复杂度

解决方案二:

时间复杂度是总运算次数表达式中受n的变化影响最大的那一项,列出你每次运算的运算次数就可以算出来了

时间: 2024-10-30 00:43:58

旅行商问题算法流程图及时间复杂度的相关文章

c++-背包问题算法流程图及时间复杂度

问题描述 背包问题算法流程图及时间复杂度 #include "iostream" #include "vector" #include "cstring" using namespace std; class PackEnum { protected: vector<int> m_p; vector<int> m_w; int m_c; int m_num; public: PackEnum(); PackEnum(vec

谁能帮我把这个SHA-1算法流程图补充完整啊

问题描述 解决方案 解决方案二:就是补充图里面模糊的公式

算法的时间复杂度(一)

转自:http://www.cnblogs.com/cj723/archive/2011/03/05/1971640.html 2.9 算法的时间复杂度 2.9.1 算法时间复杂度定义         在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就是算法的时间量度,记作:T(n) = O(f(n)).它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐近时间复杂度,简称为

部分和问题算法 代码(C)

题目: 给定整数a1, a2, ..., an, 判断是否可以从中选出若干数, 使它们的和恰好为k. 解法很多, 最简单的解法是使用深度优先搜索, 时间复杂度O(2^n), 不是最优解法. 代码: /* * main.cpp * * Created on: 2014.7.13 *本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/ * Author: Spike */ /*eclipse cdt, gcc

浅谈算法和数据结构 三 合并排序

合并排序,顾名思义,就是通过将两个有序的序列合并为一个大的有序的序列的方式来实现排序.合并排序是一种典型的分治算法:首先将序列分为两部分,然后对每一部分进行循环递归的排序,然后逐个将结果进行合并. 合并排序最大的优点是它的时间复杂度为O(nlgn),这个是我们之前的选择排序和插入排序所达不到的.他还是一种稳定性排序,也就是相等的元素在序列中的相对位置在排序前后不会发生变化.他的唯一缺点是,需要利用额外的N的空间来进行排序. 一 原理 合并排序依赖于合并操作,即将两个已经排序的序列合并成一个序列,

独家 | 一文读懂优化算法

一.前言 模拟退火.遗传算法.禁忌搜索.神经网络等在解决全局最优解的问题上有着独到的优点,其中共同特点就是模拟了自然过程.模拟退火思路源于物理学中固体物质的退火过程,遗传算法借鉴了自然界优胜劣汰的进化思想,禁忌搜索模拟了人类有记忆过程的智力过程,神经网络更是直接模拟了人脑.它们之间的联系也非常紧密,比如模拟退火和遗传算法为神经网络提供更优良的学习算法提供了思路.把它们有机地综合在一起,取长补短,性能将更加优良. 这几种智能算法有别于一般的按照图灵机进行精确计算的程序,尤其是人工神经网络,是对计算

旅行商问题和背包问题求解

问题描述 旅行商问题和背包问题求解 这是题目,有大神能帮我搞一下么.流程图和时间复杂度写一下,方便我学习与理解.谢大神 解决方案 旅行商问题和背包问题旅行商问题和背包问题旅行商问题和背包问题

C++实现自底向上的归并排序算法_C 语言

本文实例讲述了C++实现自底向上的归并排序算法.分享给大家供大家参考,具体如下: 一. 算法描述 自底向上的归并排序:归并排序主要是完成将若干个有序子序列合并成一个完整的有序子序列:自底向上的排序是归并排序的一种实现方式,将一个无序的N长数组切个成N个有序子序列,然后再两两合并,然后再将合并后的N/2(或者N/2 + 1)个子序列继续进行两两合并,以此类推得到一个完整的有序数组.下图详细的分解了自底向上的合并算法的实现过程: 二. 算法实现 /*=========================

九大排序算法总结

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等. 算法一:插入排序 插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 算法步骤 1)将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当