河北工业大学2016算法分析与设计实验报告

合集下载

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一...

《算法设计与分析》实验报告实验一递归与分治策略应用基础学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期第九周一、实验目的1、理解递归的概念和分治法的基本思想2、了解适用递归与分治策略的问题类型,并能设计相应的分治策略算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:以下题目要求应用递归与分治策略设计解决方案,本次实验成绩按百分制计,完成各小题的得分如下,每小题要求算法描述准确且程序运行正确。

1、求n个元素的全排。

(30分)2、解决一个2k*2k的特殊棋牌上的L型骨牌覆盖问题。

(30分)3、设有n=2k个运动员要进行网球循环赛。

设计一个满足要求的比赛日程表。

(40分)提交结果:算法设计分析思路、源代码及其分析说明和测试运行报告。

三、设计分析四、算法描述及程序五、测试与分析六、实验总结与体会#include "iostream"using namespace std;#define N 100void Perm(int* list, int k, int m){if (k == m){for (int i=0; i<m; i++)cout << list[i] << " ";cout << endl;return;}else{for (int i=m; i<k; i++){swap(list[m], list[i]);Perm(list, k, m+1);swap(list[m], list[i]);}}}void swap(int a,int b){int temp;temp=a;a=b;b=temp;}int main(){int i,n;int a[N];cout<<"请输入排列数据总个数:";cin>>n;cout<<"请输入数据:";for(i=0;i<n;i++){cin>>a[i];}cout<<"该数据的全排列:"<<endl;Perm(a,n,0);return 0;}《算法设计与分析》实验报告实验二递归与分治策略应用提高学号:**************姓名:*************班级:*************日期:2014-2015学年第1学期一、实验目的1、深入理解递归的概念和分治法的基本思想2、正确使用递归与分治策略设计相应的问题的算法3、掌握递归与分治算法时间空间复杂度分析,以及问题复杂性分析方法二、实验内容任务:从以下题目中任选一题完成,要求应用递归与分治策略设计解决方案。

算法设计与分析实验报告

算法设计与分析实验报告

实验一排序算法设计一、实验内容冒泡排序二、实验问题分析该问题主要涉及到了指针和循环和相互比较的方法,是综合知识的应用。

三、数学模型根据题目要求,依次对每个数据进行比较,直至得出最后结果。

如果a>b则交换位置,如果a<b则不交换。

四、程序流程图五、源代码#include <stdio.h>void sort(int a[]){int temp;for(int i=0;i<9;i++){for(int j=0;j<10-i-1;j++){if(a[j]>a[j+1]){temp=a[j];a[j]=a[j+1];a[j+1]=temp;}}}printf("排序后的数据\n"); for(i=0;i<10;i++){if(i==5){printf("\n");}printf("%d ",a[i]);}printf("\n");}void main(){int a[10];for(int i=0;i<10;i++){scanf("%d",&a[i]);}printf("排序前的数据\n"); for(i=0;i<10;i++){if(i==5){printf("\n");}printf("%d ",a[i]);}printf("\n");sort(a);}六、测试结果实验二递归算法设计一、实验内容1.判断S字符是否为“回文”的递归函数,并编写程序测试。

二、实验问题分析递归是一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法。

递归算法设计,就是把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题,在逐步求解小问题后,再返回(回溯)得到大问题的解。

算法设计与分析实验报告(模版)

算法设计与分析实验报告(模版)

武汉工程大学计算机科学与工程学院《算法设计与分析》实验报告专业班级实验地点学生学号指导教师学生姓名实验时间实验项目算法基本工具和优化技巧实验类别基本性实验实验目的及要求目的与要求:练习算法基本工具和优化技巧的使用实验内容要点:1、熟悉循环和递归的应用2、熟悉数据结构在算法设计中的应用3、了解优化算法的基本技巧4、掌握优化算法的数学模型成绩评定表类别评分标准分值得分合计上机表现积极出勤、遵守纪律主动完成实验设计任务30分实验报告及时递交、填写规范内容完整、体现收获70分说明:评阅教师:日期:年月日一、狼找兔子问题:一座山周围有n个洞,顺时针编号为0,1,2.,…,n-1。

一只狼从0号洞开始,顺时针方向计数,每当经过第m个洞时,就进洞找兔子。

输入m,n,问兔子有没有幸免的机会?如果有,该藏哪里?代码设计:。

结果:。

二、有52张牌,使他们全部正面朝上,第一轮是从第2张开始,凡是2的倍数位置上的牌翻成正面朝下;第二轮从第3张牌开始,凡是3的倍数位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;第三轮从第4张开始,凡是4的倍数位置上的牌,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上,以此类推,直到翻的牌超过104张为止。

统计最后有几张正面朝上,以及他们的位置号。

代码设计:。

结果:。

三、A、B、C、D、E 5人为某次竞赛的前5名,他们在名次公布前猜名次。

A说:B得第三名,C得第五名。

B说:D得第二名,E得第四名。

C说:B得第一名,E得第四名。

D说:C得第一名,B得第二名。

E说:D得第二名,A得第三名。

结果每个人都猜对了一半,实际名次是什么呢?代码设计:。

结果:。

算法分析与设计实验报告

算法分析与设计实验报告

算法分析与设计实验报告专业班级:姓名:学号:指导老师:实验一递归算法的设计与实现•计算整数的非负整数次幂(1)设计思路对于34按步骤可以分析:34=32*3232=31*3131=31*1对于33按步骤可以分析:33=32*31;32=31*31;31=31*1;分析可以得到:当x n中n为奇数时,x n=x*(x n/2)2当x n中n为偶数的,x n=(x n/2)2;当n/2=0;return 1;一步步进行递归返回计算,如果n位奇数,在进行一部乘以x 否则返回运算结果(2)源程序代码#include<iostream>using namespace std;int power(int x,int n){int y;if(n==0){y=1;}else{y=power(x,n/2);y=y*y;if(n%2==1){y=y*x;}}return y;}void main(){cout<<"请输入一个底数X:";int x;cin>>x;cout<<"请输入一个指数Y: ";int y;cin>>y;if(y<0){cout<<"你的输入有误:请重新输入:"<<endl; cin>>y;}int c;c=power(x,y);cout<<x<<"的"<<y<<"次幂的结果是"<<c<<endl; }(3)代码运行结果(4)时间复杂度令n=2k,则可以得到:f(n)=g(k)=k+1=logn+1=O(logn)2.基于递归算法的插入排序(1)设计思路通过主函数传来一个数组的首地址和数组的长度,然后利用递归的原理,当n=0;程序返回,执行入栈的递归程序,依次比较2个数的大小,3个数的大小等,根据比较的结果将第n个数插入适当的位置。

算法分析与设计实验报告

算法分析与设计实验报告

算法分析与设计实验报告算法分析与设计实验报告一、引言算法是计算机科学的核心,它们是解决问题的有效工具。

算法分析与设计是计算机科学中的重要课题,通过对算法的分析与设计,我们可以优化计算机程序的效率,提高计算机系统的性能。

本实验报告旨在介绍算法分析与设计的基本概念和方法,并通过实验验证这些方法的有效性。

二、算法分析算法分析是评估算法性能的过程。

在实际应用中,我们常常需要比较不同算法的效率和资源消耗,以选择最适合的算法。

常用的算法分析方法包括时间复杂度和空间复杂度。

1. 时间复杂度时间复杂度衡量了算法执行所需的时间。

通常用大O表示法表示时间复杂度,表示算法的最坏情况下的运行时间。

常见的时间复杂度有O(1)、O(log n)、O(n)、O(n log n)和O(n^2)等。

其中,O(1)表示常数时间复杂度,O(log n)表示对数时间复杂度,O(n)表示线性时间复杂度,O(n log n)表示线性对数时间复杂度,O(n^2)表示平方时间复杂度。

2. 空间复杂度空间复杂度衡量了算法执行所需的存储空间。

通常用大O表示法表示空间复杂度,表示算法所需的额外存储空间。

常见的空间复杂度有O(1)、O(n)和O(n^2)等。

其中,O(1)表示常数空间复杂度,O(n)表示线性空间复杂度,O(n^2)表示平方空间复杂度。

三、算法设计算法设计是构思和实现算法的过程。

好的算法设计能够提高算法的效率和可靠性。

常用的算法设计方法包括贪心算法、动态规划、分治法和回溯法等。

1. 贪心算法贪心算法是一种简单而高效的算法设计方法。

它通过每一步选择局部最优解,最终得到全局最优解。

贪心算法的时间复杂度通常较低,但不能保证得到最优解。

2. 动态规划动态规划是一种将问题分解为子问题并以自底向上的方式求解的算法设计方法。

它通过保存子问题的解,避免重复计算,提高算法的效率。

动态规划适用于具有重叠子问题和最优子结构的问题。

3. 分治法分治法是一种将问题分解为更小规模的子问题并以递归的方式求解的算法设计方法。

算法设计与分析实验报告

算法设计与分析实验报告

算法设计与分析实验报告算法设计与分析实验报告引言:算法设计与分析是计算机科学中的重要课程,它旨在培养学生解决实际问题的能力。

本次实验旨在通过设计和分析不同类型的算法,加深对算法的理解,并探索其在实际应用中的效果。

一、实验背景算法是解决问题的步骤和方法的描述,是计算机程序的核心。

在本次实验中,我们将重点研究几种经典的算法,包括贪心算法、动态规划算法和分治算法。

通过对这些算法的设计和分析,我们可以更好地理解它们的原理和应用场景。

二、贪心算法贪心算法是一种基于局部最优选择的算法,它每一步都选择当前状态下的最优解,最终得到全局最优解。

在实验中,我们以背包问题为例,通过贪心算法求解背包能够装下的最大价值物品。

我们首先将物品按照单位重量的价值从大到小排序,然后依次将能够装入背包的物品放入,直到背包无法再装下物品为止。

三、动态规划算法动态规划算法是一种通过将问题分解为子问题,并记录子问题的解来求解整体问题的算法。

在实验中,我们以斐波那契数列为例,通过动态规划算法计算斐波那契数列的第n项。

我们定义一个数组来保存已经计算过的斐波那契数列的值,然后通过递推公式将前两项的值相加得到后一项的值,最终得到第n项的值。

四、分治算法分治算法是一种将问题分解为更小的子问题,并通过递归求解子问题的算法。

在实验中,我们以归并排序为例,通过分治算法对一个无序数组进行排序。

我们首先将数组分成两个子数组,然后对子数组进行递归排序,最后将两个有序的子数组合并成一个有序的数组。

五、实验结果与分析通过对以上三种算法的设计和分析,我们得到了以下实验结果。

在贪心算法中,我们发现该算法能够在有限的时间内得到一个近似最优解,但并不能保证一定得到全局最优解。

在动态规划算法中,我们发现该算法能够通过记忆化搜索的方式得到准确的结果,但在问题规模较大时,其时间复杂度较高。

在分治算法中,我们发现该算法能够将问题分解为更小的子问题,并通过递归求解子问题,最终得到整体问题的解。

河北工业大学数值分析实验三实验四实验报告

河北工业大学数值分析实验三实验四实验报告

数值分析实验报告指导老师:宛艳萍姓名:班级:学号:实验三 复化辛卜生法,龙贝格法1.实验名称:复化辛卜生法,龙贝格法2.实验目的1)通过实际计算体会各种方法的精确度。

2)会编写用复化辛卜生、龙贝格算法求定积分的程序。

3.算法描述1)用复化辛卜生法计算积分 dxx I ⎰+=12)1/(1算法:复化辛卜生公式为S n =h/6∑∑+-=+++)]()2/(4)([11k k kn k x f h x f xf ,计算过程为:1.令,/)(n a b h -= ),2/(1h a f s +=;02=s2.对1,,2,1-=n k计算),2/(11h kh a f s s +++=)(22kh a f s s ++=3.))(24)((6/21b f s s a f h s +++= 。

2)龙贝格算法计算dxxI ⎰+=102)1/(156e ε=-算法)((12/12∑-=++=n k k n n n x f h T T ;/)(n a b h n -= n k h k x )2/1(2/1+=+)(3/122n n n n T T T S -+= )_(15/122n n n n S S S C +=)(63/122n n n n C C C R -+=用事后估计法控制精度2|5e -6n n R R -< 。

4.源程序:1)/* 用复化辛卜生公式求积分 */ #include "stdio.h" float fx(float x){double f;f=1.0/(1.0+x*x); return f; } double fs(int n){double a=0.0,b=1.0,h,s,s1,s2=0; int i;h=(b-a)/n; s1=fx(a+h/2); for(i=1;i<n;i++){s1=s1+fx(a+i*h+h/2); s2=s2+fx(a+i*h);}s=(h/6.0)*(fx(a)+fx(b)+4*s1+2*s2);return s;}void main(){printf("实验三复化辛卜生法计算机112 耿向飞学号:112434\n");printf("s(2)=%lf\ns(4)=%lf\ns(8)= %lf",fs(2),fs(4),fs(8));}2)/* 龙贝格法 */#include "stdio.h"#include "math.h"#define E 2.71828182//被积函数f(x)double fx(double x){double f;f=1/(1+x*x);return f;}//梯形公式求tndouble tx(int n){double s3=0.0,h,t,b=1.0,a=0.0;int i;h=(b-a)/n;for(i=1;i<n;i++)s3=s3+fx(i*h);t=(h/2)*(fx(a)+fx(b)+2*s3);return t;} double s(int n){double s;s=tx(2*n)+(1.0/3.0)*(tx(2*n)-tx(n ));return s;}double c(int n){double c;c=s(2*n)+(1.0/15.0)*(s(2*n)-s(n)) ;return c;}double r(int n){double r;r=c(2*n)+(1.0/63.0)*(c(2*n)-c(n)) ;return r;}void main(){double rr,pp;int n=1;rr=r(n);pp=r(2*n)-r(n);printf("实验三龙贝格法计算机112 耿向飞学号:112434\n");printf("结果为:%.15lf 误差小于等于: %.15lf",rr,pp);}5.运行结果1)复化辛卜生公式2)龙贝格算法6.对算法的理解与分析:复化辛卜生公式和龙贝格算法适用于求数值积分,而且都能提高计算积分的精度龙贝格算法其实是在复化辛卜生公式递推的基础之上生成的一种精度高,而且收敛速度也较快的一种算法。

《算法设计与分析》实验报告模板 (1)

《算法设计与分析》实验报告模板 (1)

《算法设计与分析》实验报告
学号:姓名:
实验一分治法求解众数问题
一、实验目的
1.掌握分治法的设计思想并能熟练应用;
2.理解分治与递归的关系。

二、实验题目
在一个序列中出现次数最多的元素称为众数,根据分治法的思想设计算法寻找众数。

三、实验程序
四、程序运行结果
实验二动态规划法求解单源最短路径问题
一、实验目的
1.深刻掌握动态规划法的设计思想;
2.熟练应用以上算法思想求解相关问题。

二、实验题目
设有一个带权有向连通图,可以把顶点集划分成多个互不相交的子集,使得任一条边的两个顶点分属不同子集,称该图为多段图。

采用动态规划法求解多段图从源点到终点的最小代价路径。

三、实验程序
四、程序运行结果
实验三贪心法求解单源点最短路径问题
一、实验目的
1.掌握贪心法的设计思想;
2.分析比较同一个问题采用不同算法设计思想求解的结果。

二、实验题目
设有一个带权有向连通图,可以把顶点集划分成多个互不相交的子集,使得任一条边的两个顶点分属不同子集,称该图为多段图。

采用贪心法求解多段图从源点到终点的最小代价路径。

三、实验程序
四、程序运行结果
实验四回溯法求解0/1背包问题
一、实验目的
1.掌握回溯法的设计思想;
2.掌握解空间树的构造方法,以及在求解过程中如何存储求解路径;
二、实验题目
给定n种物品和一个容量为C的背包,选择若干种物品(物品不可分割),使得装入背包中物品的总价值最大。

采用回溯法求解该问题。

三、实验程序
四、程序运行结果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

河北工业大学算法分析与设计2016实验报告学院: 计算机科学与软件学院班级:姓名:学号:实验一【实验学时】4学时【实验目的】1.深刻理解并掌握“分治算法”的设计思想;2.提高应用“分治算法”设计技能;3.理解这样一个观点:用递归方法编写的问题解决程序具有结构清晰,可读性强等优点,且递归算法的设计比非递归算法的设计往往要容易一些,所以当问题本身是递归定义的,或者问题所涉及到的数据结构是递归定义的,或者是问题的解决方法是递归形式的时候,往往采用递归算法来解决。

【问题描述】设有n=2k个选手要进行网球循环赛,要求设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他n-1个选手各赛一次;(2)每个选手一天只能赛一次;(3)循环赛一共进行n-1天.按照分治的策略,可将所有参赛的选手分为两部分,n=2k个选手的比赛日程表就可以通过为n/2=2k-1个选手设计的比赛日程表来决定。

递归地执行这种分割,直到只剩下2个选手时。

【源程序】#include<stdio.h>#include<math.h>void GameTable(int k, int a[80][80]){int n=2;int i, j, t, temp;a[1][1]=1; a[1][2]=2;a[2][1]=2; a[2][2]=1;for (t=1; t<k; t++){temp=n; n=n*2;for(i=temp+1; i<=n; i++)for(j=1; j<=temp; j++)a[i][j]=a[i-temp][j]+temp;for(i=1; i<=temp; i++)for(j=temp+1; j<=n; j++)a[i][j]=a[i+temp][j-temp];for(i=temp+1;i<=n; i++)for(j=temp+1; j<=n; j++)a[i][j]=a[i-temp][j-temp];}}int main(){int i,j,k;int a[80][80];printf("请输入k的数值 k=");scanf("%d",&k);GameTable(k,a);for(i=1; i<=pow(2,k); i++){for(j=1; j<=pow(2,k); j++)printf("%5d",a[i][j]);printf("\n");}return 0;}【运行结果】【分析总结】本次实验思路简单,并且编程实现也不复杂。

通过这次试验,我对于分治法的设计思想理解地更加深入。

其主要思想就是将一个大问题,分解为一个个的小问题,知道每个小问题很容易求出解为止。

最后再将子问题的解合并为一个更大规模的问题的解,自底向上逐步求出元问题的解。

实验二【实验学时】4学时【实验目的】(1)熟练掌握动态规划思想及教材中相关经典算法。

(2)掌握动态规划算法求解问题的一般特征和步骤;使用动态规划法编程,求解0/1背包问题。

【问题描述】0/1背包问题是给定n个重量为{w1, w2, … ,wn}、价值为{v1, v2, … ,vn}的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,并且要能够装到背包中。

在0/1背包问题中,物品i或者被装入背包,或者不被装入背包,设xi表示物品i装入背包的情况,则当xi=0时,表示物品i没有被装入背包,xi=1时,表示物品i被装入背包。

0/1背包问题可以看作是决策一个序列(x1, x2, …, xn),对任一变量xi的决策是决定xi=1还是xi=0。

在对xi-1决策后,已确定了(x1, …, xi-1),在决策xi时,问题处于下列两种状态之一:(1)背包容量不足以装入物品i,则xi=0,背包不增加价值;(2)背包容量可以装入物品i,则xi=1,背包的价值增加了vi。

这两种情况下背包价值的最大者应该是对xi决策后的背包价值。

【源程序】//本程序的测试用例是课本上的例题#include <stdio.h>int x[100], V[100][100];int max(int a, int b){return (a>b ? a : b);}int KnapSack(int w[], int v[], int n, int C){int i,j;//初始化第0列for(i=0; i<=n; i++)V[i][0]=0;//初始化第0行for(j=0; j<=C; j++)V[0][j]=0;//双重for循环完成填表过程for(i=1; i<=n; i++)for(j=1; j<=C ; j++)if(j<w[i]) V[i][j]=V[i-1][j];else V[i][j]=max(V[i-1][j], V[i-1][j-w[i]]+v[i]); //从右下角开始往回寻找for(j=C, i=n; i>0; i--){if(V[i][j]>V[i-1][j]){x[i]=1;j-=w[i];}else x[i]=0;}//返回背包最大价值return V[n][C];}int main(){//n是物品个数;C是背包总容量int w[100], v[100], n, C;printf("请输入物品种类:");scanf("%d",&n);printf("请输入背包重量:");scanf("%d",&C);printf("请输入重量矩阵:");for(int i=1; i<=n; i++)scanf("%d",&w[i]);//这里注意i从1开始取值printf("请输入价值矩阵:");for(int i=1; i<=n; i++)scanf("%d",&v[i]);//这里注意i从1开始取值printf("\n");printf("背包取得的最大价值为:%d\n",KnapSack(w, v, n, C)); printf("问题的最优解序列为:");for(int i=1; i<=n; i++)printf("%2d",x[i]);printf("\n\n");printf("二维矩阵V为:\n");for(int i=0; i<=n; i++){for(int j=0; j<=C; j++)printf("%3d",V[i][j]);printf("\n");}return 0;}【运行结果】【分析总结】通过这次试验,我体会到了动态规划法设计思想的巧妙之处。

动态规划算法通常用于求解具有某种最优性质的问题。

在这类问题中,可能会有许多可行解。

每一个解都对应于一个值,都希望找到具有最优值的解。

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。

与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。

实验三【实验学时】6学时【实验目的】掌握贪心算法求解问题的一般特征和步骤;通过使用贪心算法求解0/1背包和TSP问题,进一步加深对贪心算法的理解和运用。

【问题描述】0/1背包问题是给定n个重量为{w1, w2, … ,wn}、价值为{v1, v2, … ,vn}的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,并且要能够装到背包中每次从物品集合中选择单位重量价值最大的物品,如果其重量小于背包容量,就可以把它装入,并将背包容量减去该物品的重量。

因此背包问题具有最优子结构性质。

TSP问题是指旅行家要旅行n个城市然后回到出发城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。

1)最近邻点策略:从任意城市出发,每次在没有到过的城市中选择最近的一个,直到经过了所有的城市,最后回到出发城市。

2)最短链接策略:每次在整个图的范围内选择最短边加入到解集合中,但是,要保证加入解集合中的边最终形成一个哈密顿回路。

【0/1背包源程序】//本程序的测试用例来源于课本例题#include<stdio.h>#include<algorithm>using namespace std;struct G{double v;double w;double x=0;int flag=0;}good[100];bool cmp1(G a, G b)//按照性价比降序排序return a.v/a.w > b.v/b.w;}bool cmp2(G a, G b)//按照序号升序排序{return a.flag < b.flag;}int main(){int i, n, C;double maxValue=0;printf("请输入物品种类:");scanf("%d",&n);printf("请输入背包重量:");scanf("%d",&C);printf("请输入重量矩阵:");for(int i=0; i<n; i++){scanf("%lf",&good[i].w);good[i].flag=i;}printf("请输入价值矩阵:");for(int i=0; i<n; i++)scanf("%lf",&good[i].v);sort(good, good+n, cmp1);for(i=0; good[i].w<=C; i++){good[i].x=1;maxValue+=good[i].v;C-=good[i].w;}good[i].x=(double)C/good[i].w;maxValue+=good[i].x*good[i].v;printf("背包的最大价值为:%.2f\n",maxValue); sort(good, good+n, cmp2);printf("问题的最优解向量为:");for(int i=0; i<n; i++){printf("%.1f ",good[i].x);}printf("\n");return 0;}【运行结果】【TSP源程序】#include <stdio.h>//#define LOCALint arc[10][10];int n;//城市个数int w;//起点城市int TSP(int n, int w){int edgeCount = 0, TSPLength = 0;int min = 100, u, v;int flag[10]={0};//可以对于flag数组中所有元素清零; u=w; flag[w]=1;while(edgeCount < n-1){min = 100;for(int j=1; j<=n; j++){if(flag[j]==0 && arc[u][j]<min){v=j;min=arc[u][j];}}TSPLength+=arc[u][v];flag[v]=1;edgeCount++;printf("%d-->", u);u=v;}printf("%d-->%d\n", v, w);return (TSPLength+arc[u][w]);}int main(){#ifdef LOCALfreopen("data.in", "r", stdin);freopen("data.out", "w", stdout); #endif // LOCALprintf("请输入城市个数:");scanf("%d",&n);printf("请输入代价矩阵:\n");for(int i=1; i<=n; i++)for(int j=1; j<=n; j++){scanf("%d",&arc[i][j]);}printf("请输入起点城市:");scanf("%d",&w);printf("最短路径为:");printf("最小代价为:%d", TSP(n, w)); return 0;}【运行结果】【分析总结】通过这次试验,我更好地掌握了贪心法的设计思想。

相关文档
最新文档