算法设计实验题目
算法设计题_实验报告
一、实验目的1. 理解和掌握最优路径搜索算法的基本原理和实现方法。
2. 能够根据实际问题选择合适的算法,并对其进行优化和改进。
3. 提高算法分析和设计能力,以及编程实现能力。
二、实验内容本次实验要求设计并实现一种最优路径搜索算法,以解决迷宫问题。
迷宫由二维数组表示,其中1表示障碍,0表示通路。
要求算法能够从入口位置出发,找到到达出口的最短路径。
三、实验原理1. Dijkstra算法:Dijkstra算法是一种基于贪心策略的最短路径算法,适用于图中所有边的权重都为非负值的情况。
算法的基本思想是从起点出发,逐步扩展到相邻节点,计算到达每个节点的最短路径长度,并记录下到达该节点的最短路径。
2. A搜索算法:A搜索算法是一种启发式搜索算法,结合了Dijkstra算法和最佳优先搜索算法的优点。
算法的基本思想是在Dijkstra算法的基础上,引入启发函数来估计从当前节点到目标节点的距离,从而优先搜索那些更有可能到达目标节点的路径。
四、实验过程1. 算法设计(1)Dijkstra算法实现:1)初始化:设置一个距离数组dist[],用于存储从起点到各个节点的最短路径长度,初始时将起点到自身的距离设为0,其余节点设为无穷大。
2)更新距离:从距离数组中选取距离最小的节点,将其标记为已访问,并将该节点到其相邻节点的距离进行更新。
3)重复步骤2),直到找到目标节点或所有节点都已访问。
(2)A搜索算法实现:1)初始化:设置一个开放列表openList和封闭列表closedList,分别用于存储待搜索节点和已搜索节点。
将起点加入openList,并设置其f值(g值+启发函数值)。
2)搜索过程:从openList中选取f值最小的节点,将其标记为当前节点,并将其加入closedList。
3)更新相邻节点:对于当前节点的相邻节点,计算其g值、h值和f值,如果相邻节点不在closedList中,且其f值小于openList中对应节点的f值,则将其加入openList。
常见算法实验题整理
实现斐波那契数列的递归算法 (1)实现二分检索的递归算法 (3)用递归算法求出数组的最大最小元素 (5)归并排序算法实现 (7)递归快速排序算法实现 (9)带期限的作业排序算法 (11)二元归并树算法 (14)0-1背包问题 (17)每对节点之间的最短路径 (20)N皇后问题 (26)实现斐波那契数列的递归算法#include<iostream>using namespace std;//函数声明int Fibonacci(int n);int main(){int n;cout<<"请输入一个n,将输出Fibonacci前n项数据\nn=";cin>>n;cout<<"Fibonacci数列的前"<<n<<"项为\n";for (int i=1;i<=n;i++){cout<<Fibonacci(i)<<" ";}cout<<endl;return 0;}int Fibonacci(int n){//若为0,输入n不合法,返回0if (n<0){return 0;}//函数结束条件if (n==0){return 1;}if (n==1){return 1;}//f(n)=f(n-1)+f(n-2);return Fibonacci(n-1)+Fibonacci(n-2); }实现二分检索的递归算法#include<iostream>using namespace std;//二分检索的递归算法,返回为-1,表明查询的数不在查询数组中;否则返回查询数在数组中的下标ºint binary_search(int *arr,int low,int high,int target);int main(){//查询数组int arr[]={11,22,33,44,55,66,77,88,99,110,121};//查询结果的下标int flag;//需要查询的数int n;int len=sizeof(arr)/sizeof(int);cout<<"查询数组中所有的元素为:\n";for (int i=0;i<len;i++){cout<<arr[i]<<" ";}cout<<"\n******************************************************** ********\n";cout<<"请输入一个数n,程序将会判断n是否在查询数组中;输入-1终止程序\n";cin>>n;while(n!=-1){flag=binary_search(arr,0,len-1,n);//flag不为-1,表明n在查询数组中if (flag!=-1){cout<<n<<"是查询数组中第"<<flag<<"个元素\n";}else{cout<<n<<"不存在于查询数组中\n";}cout<<"********************************************************** ******\n";cout<<"请继续输入需要查询的数据;输入-1终止程序\n";cin>>n;}return 0;}int binary_search(int *arr,int low,int high,int target) {//没有找到返回-1if (high<low){return -1;}//取中间数int mid=(low+high)/2;//判断是否找到目标数if (arr[mid]==target){return mid;}//目标数在左半边else if (arr[mid]>target){binary_search(arr,low,mid-1,target);}//目标数在右半边else{binary_search(arr,mid+1,high,target);}}用递归算法求出数组的最大最小元素#include<iostream>#include<string>using namespace std;//输出数组中元素void showArray(int *arr,int len,string msg="数组中的元素为:\n"); //找到数组中最大元素int findMaxOfArr(int * arr,int n);//找到数组中最小元素int findMinOfArr(int *arr,int n);int main(){int arr[]={12,555,133,143,12,13,7,21,3};int len=sizeof(arr)/sizeof(int);showArray(arr,len);cout<<"数组中最大元素:\n"<<findMaxOfArr(arr,len)<<endl;cout<<"数组中最小元素:\n"<<findMinOfArr(arr,len)<<endl;return 0;}//输出数组中元素void showArray(int *arr,int len,string msg){cout<<msg<<endl;for (int i=0;i<len;i++){cout<<arr[i]<<" ";}cout<<endl;}//找到数组中最大元素int findMaxOfArr(int * arr,int n){//递归结束条件if (n==1){return max(arr[0],arr[1]);}else{return max(findMaxOfArr(arr,n-1),arr[n-1]);}}//找到数组中最小元素int findMinOfArr(int *arr,int n){//递归结束条件if (n==1){return min(arr[0],arr[1]);}else{return min(findMinOfArr(arr,n-1),arr[n-1]);}}归并排序算法实现#include<iostream>#include<string>using namespace std;int A[]={1,0,3,7,2,14,4,8};//输出数组中元素void showArray(int *arr,int len,string msg="数组中的元素为:\n"); //合并两个数组void merge(int low,int mid,int high);//递归排序void mergeSort(int low,int high);int main(){int len=sizeof(A)/sizeof(int);mergeSort(0,len-1);showArray(A,len);return 0;}void showArray(int *arr,int len,string msg){cout<<msg<<endl;for (int i=0;i<len;i++){cout<<arr[i]<<" ";}cout<<endl;}//归并两个有序数组void merge(int low,int mid,int high){int* B=new int [high-low+1];int B_Index=0;int A_i=low;int A_j=mid+1;while (A_i<=mid && A_j<=high){if (A[A_i]<A[A_j]){B[B_Index++]=A[A_i++];}else{B[B_Index++]=A[A_j++];}}//处理没有取尽的数组if (A_i>mid){for (int i=A_j;A_j<=high;){B[B_Index++]=A[A_j++];}}else{for (int i=A_i;A_i<=mid;){B[B_Index++]=A[A_i++];}}//把数组B中的元素复制到数组A中for (int i=low;i<=high;i++){A[i]=B[i-low];}//释放B申请的空间delete[] B;}//归并递归排序void mergeSort(int low,int high) {if (low<high){A[1]=A[1];int mid=(low+high)/2;mergeSort(low,mid);mergeSort(mid+1,high);merge(low,mid,high);}}递归快速排序算法实现#include<iostream>#include<string>using namespace std;int A[]={7,0,3,1,2,14,4,8};//输出数组中元素void showArray(int *arr,int len,string msg="数ºy组Á¨¦中D的Ì?元a素?为a:\n");//用A[low]划分集合Aint partition(int low,int high);//递归快速排序void quickSort(int low,int high);int main(){int len=sizeof(A)/sizeof(int);showArray(A,len,"原来数组中的元素为:");quickSort(0,len-1);showArray(A,len,"快速排序后数组中的元素为:");}void showArray(int *arr,int len,string msg){cout<<msg<<endl;for (int i=0;i<len;i++){cout<<arr[i]<<" ";}cout<<endl;}int partition(int low,int high){int v=A[low];int i=low;while(i<high){//i右移?while(A[i]<=v){i++;}//high左移while(A[high]>v){high--;}if (i<high){swap(A[i],A[high]);}}//把划分元素放到相应的位置A[low]=A[high];A[high]=v;return high;}//递归快速排序void quickSort(int low,int high) {if (low<high){int j=partition(low,high);quickSort(low,j-1);quickSort(j+1,high);}}带期限的作业排序算法#include<iostream>#include<string>using namespace std;//带期限和效益单位时间的作业排序贪心算法int JS(int D[],int J[],int n,int& k);//按p的非增次序排列作业void sortDeadLine(int p[],int d[],int n); int main(){int n=4,k;int p[]={-1,100,10,15,20};int d[]={-1,3,1,2,1};int J[4];sortDeadLine(p,d,n);JS(d,J,n,k);cout<<"所有作业的价值为:";for (int i=1;i<=4;i++){cout<<p[i]<<" ";}cout<<"\n所有作业的期限为:";for (int i=1;i<=4;i++){cout<<d[i]<<" ";}cout<<"\n最终选取作业的价值为:";for (int i=1;i<=k;i++){cout<<p[J[i]]<<" ";}cout<<endl;return 0;}//按照p的非增序排列作业void sortDeadLine(int p[],int d[],int n) {for (int i=1;i<=n;i++){for (int j=1;j<=n-i;j++){if (p[j]<p[j+1]){int t1=p[j];p[j]=p[j+1];p[j+1]=t1;int t2=d[j];d[j]=d[j+1];d[j+1]=t2;}}}}int JS(int D[],int J[],int n,int& k){int i,r;//初始化J[0]=D[0]=0;//计入作业1k=1;J[1]=1;//按p的非增次序考虑作业。
计算机算法实践教学参考题目
遗传算法设计与实现(3-4人)
一种通用的人工智 如解决函数优化、TSP、排课、聚类等问题。 关键是对问题的编码。
五子棋游戏算法的设计与实现(2-3人)
实现简单的人机对弈五子棋算法
贪吃蛇游戏算法的设计与实现(2-3人)
决策树算法设计与实现 (2-4人)
ID3、C4.5等
段旭良@四川农业大学 5025968@
《算法分析与设计》实践教学参考选题
大整数运算类的设计与实现(3-4人)
实现大整数(几百位)的加减乘除、乘方等
主要应用于RSA公钥加密
HMAC(消息认证码)的设计与实现(1-2人)
段旭良@四川农业大学 5025968@
《算法分析与设计》实践教学参考选题
蚁群优化算法的设计与实现(3-5人)
人工智能优化算法,应用范围广 解决TSP问题等
XXX算法优化及改进研究
规模要适中
自选题目
选题之后及时和我沟通确定 要有算法内容
段旭良@四川农业大学 5025968@
《算法分析与设计》实践教学参考选题
中文分词算法的研究与设计 (3-4人)
较为完善的分词算法 区分英文、识别数字、小数 识别人名地名
XXX算法可视化研究与实现(3-4人)
实现算法可视化 演示算法执行过程
BP神经元网络设计与实现(3-5人)
经典的人工智能算法 用于预测、分类、回归等
实现贪吃蛇小游戏。
段旭良@四川农业大学 5025968@
《算法分析与设计》实践教学参考选题
SOM自组织神经元网络(3-4人)
人工智能算法 自学习、自组织,具有学习能力 模式识别、分类、聚类等
《算法设计与分析》课程实验报告 (贪心算法(一))
《算法设计与分析》课程实验报告实验序号:07实验项目名称:实验8 贪心算法(一)一、实验题目1.删数问题问题描述:键盘输入一个高精度的正整数N(不超过250 位),去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的非负整数。
编程对给定的N 和k,寻找一种方案使得剩下的数字组成的新数最小。
若输出前有0则舍去2.区间覆盖问题问题描述:设x1,x2,...xn是实轴上的n个点。
用固定长度为k的闭区间覆盖n个点,至少需要多少个这样的固定长度的闭区间?请你设计一个有效的算法解决此问题。
3.会场安排问题问题描述:假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。
设计一个有效的贪心算法进行安排。
(这个问题实际上是著名的图着色问题。
若将每一个活动作为图的一个顶点,不相容活动间用边相连。
使相邻顶点着有不同颜色的最小着色数,相应于要找的最小会场数。
)4.导弹拦截问题问题描述:某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。
但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。
某天,雷达捕捉到敌国的导弹来袭。
由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
给定导弹依次飞来的高度(雷达给出的高度数据是≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
二、实验目的(1)通过实现算法,进一步体会具体问题中的贪心选择性质,从而加强对贪心算法找最优解步骤的理解。
(2)掌握通过迭代求最优的程序实现技巧。
(3)体会将具体问题的原始数据预处理后(特别是以某种次序排序后),常能用贪心求最优解的解决问题方法。
三、实验要求(1)写出题1的最优子结构性质、贪心选择性质及相应的子问题。
(2)给出题1的贪心选择性质的证明。
(3)(选做题):写出你的算法的贪心选择性质及相应的子问题,并描述算法思想。
算法设计与分析习题与实验题(12.18)
《算法设计与分析》习题第一章引论习题1-1 写一个通用方法用于判定给定数组是否已排好序。
解答:Algorithm compare(a,n)BeginJ=1;While (j<n and a[j]<=a[j+1]) do j=j+1;If j=n then return trueElseWhile (j<n and a[j]>=a[j+1]) do j=j+1;If j=n then return true else return false end ifEnd ifend习题1-2 写一个算法交换两个变量的值不使用第三个变量。
解答:x=x+y; y=x-y; x=x-y;习题1-3 已知m,n为自然数,其上限为k(由键盘输入,1<=k<=109),找出满足条件(n2-mn-m2)2=1 且使n2+m2达到最大的m、n。
解答:m:=k; flag:=0;repeatn:=m;repeatl:=n*n-m*n-m*n;if (l*l=1) then flag:=1 else n:=n-1;until (flag=1) or (n=0)if n=0 then m:=m-1until (flag=1) or (m=0);第二章基础知识习题2-1 求下列函数的渐进表达式:3n 2+10n ; n 2/10+2n ; 21+1/n ; log n 3; 10 log3n 。
解答: 3n 2+10n=O (n 2), n 2/10+2n =O (2n ), 21+1/n=O (1), log n 3=O (log n ),10 log3n =O (n )。
习题2-2 说明O (1)和 O (2)的区别。
习题2-3 照渐进阶从低到高的顺序排列以下表达式:!n ,3/22,2,20,3,log ,4n n n n n 。
解答:照渐进阶从低到高的顺序为:!n 、 3n、 24n 、23n 、20n 、log n 、2习题2-4(1) 假设某算法在输入规模为n 时的计算时间为n n T 23)(⨯=。
初级编程算法设计方法15种典型例题
初级编程算法设计方法15种典型例题本文档介绍了初级编程算法设计的15种典型例题,以帮助读者提高编程技能和解决问题的能力。
1. 逆序输出题目要求:输入一个整数n,逆序输出其各个位上的数字。
示例:输入:1234输出:43212. 求和题目要求:输入一个整数n,计算从1到n的所有整数的和。
示例:输入:5输出:153. 阶乘计算题目要求:输入一个整数n,计算n的阶乘。
示例:输入:4输出:244. 素数判断题目要求:输入一个正整数n,判断n是否为素数。
示例:输入:7输出:是素数5. 最大公约数题目要求:输入两个正整数a和b,计算它们的最大公约数。
示例:输入:12, 18输出:66. 最小公倍数题目要求:输入两个正整数a和b,计算它们的最小公倍数。
示例:输入:4, 6输出:127. 数字反转题目要求:输入一个整数n,将其各个位上的数字反转。
示例:输入:输出:8. 数字平方根题目要求:输入一个正整数n,计算它的平方根。
示例:输入:9输出:39. 日期格式化题目要求:输入一个日期字符串,将其格式化为YYYY-MM-DD的格式。
示例:输入:""输出:"2022-11-30"10. 列表合并题目要求:输入两个已排序的列表a和b,将它们合并成一个有序的列表。
示例:输入:[1, 3, 5], [2, 4, 6]输出:[1, 2, 3, 4, 5, 6]11. 找出重复元素题目要求:输入一个列表,找出其中重复的元素。
示例:输入:[1, 2, 3, 2, 4, 5, 3]输出:[2, 3]12. 字符串反转题目要求:输入一个字符串,将其反转。
示例:输入:"Hello"输出:"olleH"13. 矩阵转置题目要求:输入一个m ×n的矩阵,将其转置为n ×m的矩阵。
示例:输入:[[1, 2, 3], [4, 5, 6]]输出:[[1, 4], [2, 5], [3, 6]]14. 链表反转题目要求:输入一个链表,将其反转。
数据结构算法设计题及答案
数据结构算法设计题及答案一、题目设计一个算法,用于在一个未排序的整数数组中查找第二小的元素。
二、算法思路首先,我们可以通过遍历数组找到最小的元素。
然后,再次遍历数组,排除已经找到的最小元素,找到剩余元素中的最小元素,即为第二小的元素。
三、算法实现(使用 Python 语言)```pythondef find_second_smallest(arr):min1 = float('inf')min2 = float('inf')for num in arr:if num < min1:min2 = min1min1 = numelif num < min2 and num!= min1:min2 = numreturn min2```四、示例输入与输出假设我们有数组`5, 3, 8, 1, 9` 。
当我们调用`find_second_smallest(5, 3, 8, 1, 9)`时,算法首先找到最小的元素`1` ,然后在剩余元素`5, 3, 8, 9` 中找到最小的元素`3` ,所以返回`3` 。
五、题目给定一个链表,判断链表中是否存在环。
六、算法思路我们可以使用快慢指针的方法来解决这个问题。
慢指针每次移动一步,快指针每次移动两步。
如果在移动过程中,快慢指针相遇,那么就说明链表中存在环;如果快指针到达链表末尾,那么就说明链表中不存在环。
七、算法实现(使用 Python 语言)```pythonclass ListNode:def __init__(self, val=0, next=None):selfval = valselfnext = nextdef has_cycle(head):slow = headfast = headwhile fast and fastnext:slow = slownextfast = fastnextnextif slow == fast:return Truereturn False```八、示例输入与输出假设我们有一个链表`1 > 2 > 3 > 4 > 5 > 2` (其中 5 指向 2 形成环)。
算法设计题目.docx
第2章1、大整数乘法的O(nm log(3/2))算法给定2个大整数u和v,它们分别有m位和n位数字,且mn。
用通常的乘法求uv的值需要O(mn)时间。
可以u和v均看作是有n位数字的大整数,用教材第2章介绍的分治法,在O(n log3)时间内计算uv的值。
当m比n小得多时,用这种方法就显得效率不够高。
试设计一个算法,在上述情况下用O(nm log(3/2))时间求出uv的值。
2、O(1)空间子数组换位算法设a[0:n-1]是一个有n个元素的数组,k(1kn-1)是一个非负整数。
试设计一个算法将子数组a[0:k-1]与a[k+1:n-1]换位。
要求算法在最坏情况下耗时O(n),且只用到O(1)的辅助空间。
3、段合并排序算法如果在合并排序算法的分割步骤中,将数组a[0:n-1]划分为个子数组,每个子数组中有O()个元素。
然后递归地对分割后的子数组进行排序,最后将所得到的个排好序的子数组合并成所要的排好序的数组a[0:n-1]。
设计一个实现上述策略的合并排序算法,并分析算法的计算复杂性。
4、合并排序算法对拨给元素存储于数组和存储于链表中的2种情形,写出合并排序算法。
5、非增序快速排序算法如何修改QuickSort才能使其将输入元素按非增序排序?第三章1、整数线性规划问题考虑下面的整数线性规划问题试设计一个解此问题的动态规划算法,并分析算法的计算复杂性。
2、Ackermann函数Ackermann函数A(m,n)可递归地定义如下:A(m,n)=试设计一个计算A(m,n)的动态规划算法,该算法只占用O(m)空间。
3、独立任务最优调试问题问题描述:用2台机A和B处理n个作业。
设第i个作业交给机器A处理时需要时间ai ,若由机器B来处理,则需要时间bi。
由于各作业的选战和机器的性能关系,很可能对于某些i,有ai≥bi,而对于某些j,j≠i,有ai <bj。
既不能将一个作业分开由2台机器处理,也没有一台机器能同时处理2个作业。
算法实验设计题
在一个按照东西和南北方向划分成规整街区的城市里,n 个居民点散乱地分布在不同的街区中。
用x 坐标表示东西向,用y 坐标表示南北向。
各居民点的位置可以由坐标(x,y)表示。
街区中任意2 点(x 1,y 1)和(x2,y2)之间的距离可以用数值|x1-x2|+|y 1-y2|度量居民们希望在城市中选择建立邮局的最佳位置,使n 个居民点到邮局的距离总和最小。
编程任务:给定n 个居民点的位置,编程计算n 个居民点到邮局的距离总和的最小值。
´数据输入:第 1 行是居民点数n,1<n<=10000。
接下来n 行是居民点的位置,每行2 个整数x 和y,- 10000<=x ,y <=10000。
结果输出:n 个居民点到邮局的距离总和的最小值。
例如输入输出5 101 22 21 33 -23 3设计递归算法求解如下多项式:均分纸牌(NOIP2002tg)[问题描述] 有N 堆纸牌,编号分别为1,2,…, N。
每堆上有若干张,但纸牌总数必为N 的倍数。
可以在任一堆上取若干张纸牌,然后移动。
移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为N 的堆上取的纸牌,只能移到编号为N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
例如N=4,4 堆纸牌数分别为:①9 ②8 ③17 ④ 6移动3次可达到目的:从③取 4 张牌放到④(9 8 13 10)-> 从③取 3 张牌放到②(9 11 10 10)-> 从②取1 张牌放到①(10 10 10 10)。
[输入]:键盘输入文件名。
文件格式:N(N 堆纸牌,1 <= N <= 100)A1 A2 …An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)[输出]:输出至屏幕。
格式为:所有堆均达到相等时的最少移动次数。
《算法设计与分析》- 课内上机实验题目及其解答
1 × 23 × 4 = 92
12 × 3 × 4 = 144
西安邮电大学计算机学院
动态规划
西安邮电大学计算机学院
动态规划
西安邮电大学计算机学院
动态规划
算法伪代码
西安邮电大学计算机学院
西安邮电大学计算机学院
递归与分治策略
【问题分析】
(1)数组的生成:许多同学采用固定数组的做法,实际上采用随机数组 是一个比较好的做法,一是可以生成随机数字,便于测试代码;二是相对
于固定长度数组可以很方便地生成任意长度的数组。如下:
西安邮电大学计算机学院
递归与分治策略
(2)算法分析:给同学们的资料上面的算法如下所示:
西安邮电大学计算机学院
贪心算法
算法伪代码
西安邮电大学计算机学院
贪心算法
西安邮电大学计算机学院
贪心算法
(2)小结:本题目大部分同学设计正确,也有部分同学考虑不够全面,
特别是一些边界值没有考虑。测试用例仍然是老问题。
西安邮电大学计算机学院
算法设计与分析
回溯法
西安邮电大学计算机学院
回溯法
基本题 1:最小重量机器设计问题(第 4 版教材
令 TriArray 表示数字三角形转换成的二维矩阵, ResArray[ i ][ j ]为结果数组,表示第 i 层第 j 个数字到最低端的最优解。 则有递推式:
ResArray[ i - 1 ][ j ] = max{ ( TriArray[ i - 1 ][ j ] + ResArray[ i ][ j ] ),
比较好的算法场景设计题
比较好的算法场景设计题1.引言算法场景设计题是评估一名候选人算法设计与解决问题能力的常见方式。
通过这种设计题,面试官可以考察候选人的综合分析、问题建模、算法设计与实现等能力。
本文将介绍一些比较好的算法场景设计题,帮助读者更好地理解和应对类似问题。
2.题目一:最小生成树问题2.1问题描述给定一个无向带权连通图G,求其最小生成树。
2.2解决思路利用Kr us ka l算法或P ri m算法求解最小生成树问题。
2.2.1K r u s k a l算法1.将图G中的边按权值从小到大排序。
2.依次选择权值最小且不构成环的边加入最小生成树的边集合。
3.直到边集合中的边数等于图G的节点数减一为止。
2.2.2P r i m算法1.选择任意一个节点作为起始点,将其加入最小生成树的节点集合。
2.搜索与已选节点集合相连且权值最小的边,将其加入最小生成树的边集合,并将其端点加入已选节点集合。
3.重复步骤2,直到已选节点集合包含图G的所有节点。
2.3示例假设给定图G如下:5/-----\||A--6--B--7--C||/\---8---/利用Kr us ka l算法求解最小生成树的步骤如下:1.将边集合排序得到:[(A,B,5),(B,C,7),(A,C,8),(A,B,6)]。
2.选择权值最小的边(A,B,5)加入最小生成树的边集合。
3.选择权值次小的边(B,C,7)加入最小生成树的边集合。
4.最小生成树的边集合为:[(A,B,5),(B,C,7)]。
3.题目二:最大子序列和问题3.1问题描述给定一个整数序列,求其连续子序列的最大和。
3.2解决思路利用动态规划求解最大子序列和问题。
1.定义状态:d p[i]表示以第i个元素结尾的连续子序列的最大和。
2.状态转移方程:dp[i]=m ax(n um s[i],d p[i-1]+n um s[i]),其中n u ms为给定的整数序列。
3.初始状态:d p[0]=n um s[0]。
算法课程设计题目-最终
每一个题目要求至少用两种方法,如蛮力法和算法策略方法解决。
题目:1. 果园篱笆某大学ACM集训队,不久前向学校申请了一块空地,成为自己的果园。
全体队员兴高采烈的策划方案,种植了大批果树,有梨树、桃树、香蕉……。
后来,发现有些坏蛋,他们暗地里偷摘果园的果子,被ACM集训队队员发现了。
因此,大家商量解决办法,有人提出:修筑一圈篱笆,把果园围起来,但是由于我们的经费有限,必须尽量节省资金,所以,我们要找出一种最合理的方案。
由于每道篱笆,无论长度多长,都是同等价钱。
所以,大家希望设计出来的修筑一圈篱笆的方案所花费的资金最少。
有人已经做了准备工序哦,统计了果园里果树的位置,每棵果树分别用二维坐标来表示,进行定位。
现在,他们要求根据所有的果树的位置,找出一个n边形的最小篱笆,使得所有果树都包围在篱笆内部,或者在篱笆边沿上。
本题的实质:凸包问题。
请使用蛮力法和分治法求解该问题。
2. 利用分治法求解空中飞行管理问题。
随着空中各种飞机数量的增加,飞行安全控制变得尤为重要,要想提高空中飞行的安全系数,其中一个亟需解决的问题就是预先知道空中哪两架飞机之间具有最大碰撞危险。
如果知道了这两架具有最大碰撞危险的飞机,我们就预先通知飞行员进行相应的安全飞行,以避免碰撞。
从穷举法的角度很容易解决这个问题,但是效率太低,时间复杂度是O(n2),不符合实际需要,利用分治法分而制之的思想,降低问题复杂度,通过建模求解,把时间复杂度降到O(nlogn),可以较好地解决实际问题。
1分治法分治法基本思想:任何一个用计算机求解的问题时间复杂度都与其规模N有关。
求解该问题,至少使用蛮力法和分治法求解,并比较时间复杂性。
3. 问题描述:键盘输入一个高精度的正整数n(n<10位),去掉任意s个数字后剩下的数字按原左右次序组成一个新的正整数,寻求一种方案,使得新的正整数最小。
问题分析1)贪心法求解:删k个数符的全局最优解,包含了删除1个数符的子问题的最优解。
《算法设计综合实训》题目
算法设计综合实训题目0.逆序数字(借助栈)编写一个函数,接收一个4位整数值,返回这个数中数字逆序后的结果值。
例如,给定数7631,函数返回1367.输入:第一行一个正整数T(T<=10),表示有T组测试数据; 以下T行,每行一个非负的整数N。
输出:共T行,对于每组输入数据输出一行,即数字逆序后的结果值。
样本输入:3763110185158样本输出:1367810185151.人见人爱A+B这个题目的A和B不是简单的整数,而是两个时间,A和B 都是由3个整数组成,分别表示时分秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。
输入:输入数据有多行组成,首先是一个整数N,表示测试实例的个数,然后是N行数据,每行有6个整数AH,AM,AS,BH,BM,BS,分别表示时间A和B所对应的时分秒。
题目保证所有的数据合法。
输出:对于每个测试实例,输出A+B,每个输出结果也是由时分秒3部分组成,同时也要满足时间的规则(即:分和秒的取值范围在0-59),每个输出占一行,并且所有的部分都可以用32位整数表示。
样本输入:21 2 3 4 5 634 45 56 12 23 34样本输出:5 7 947 9 302.敲七【问题描述】输出7和7的倍数,还有包含7的数字例如(17,27,37...70,71,72,73...)【要求】【数据输入】一个整数N。
(N不大于30000)【数据输出】从小到大排列的不大于N的与7有关的数字,每行一个。
【样例输入】20【样例输出】714173.统计同成绩学生人数问题【问题描述】读入N名学生的成绩,将获得某一给定分数的学生人数输出。
【要求】【数据输入】测试输入包含若干测试用例,每个测试用例的格式为第1行:N第2行:N名学生的成绩,相邻两数字用一个空格间隔。
第3行:给定分数当读到N=0时输入结束。
其中N不超过1000,成绩分数为(包含)0到100之间的一个整数。
算法设计与分析:期中试卷+实验题目文字解析
算法设计与分析:期中试卷+实验题目文字解析期中试卷:算法设计与分析实验题目简单解析:P39-P43:2-1众数问题;2-7集合划分问题;2-10标准二维表问题;2-11整数因子分解问题P79-P80:3-1独立任务最有调度;3-2编辑距离问题;3-3石子合并问题;3-4数字三角形问题P109:4-2最优合并问题;4-4 磁盘文件最优存储问题P151-P152:5-1子集和问题;5-3最小重量机器设计问题2-1众数问题给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。
多重集S 中重数最大的元素称为众数。
例如,S={1,2,2,2,3,5}。
多重集S的众数是2,其重数为3。
数据输入输入包括多组数据,请处理到EOF结束。
每组数据,以一个n(1<=n<=100,000)开始,接下n 行,每行有一个数字(-231~231)。
数据输出对于每组输入数据,输出一行一个数字,表示众数。
如果存在多个解,只需输出值最小的众数即可。
算法思路:首先用快速排序算法排序数组,找到当前数组的中位数及其位置,然后把在数组中与中位数相同的数字向它靠拢,就可以统计中位数的个数。
现在数组已经被中间这些相等的数字分开了。
那么递归条件就有了。
如果中位数的个数比它左边这段短,那么说明左边有可能找到更多的,所以递归继续。
反之,如果左边这段数的长度比较短,那么就没必要继续递归。
对右边那段数据使用同样的策略。
2-7集合划分问题n个元素的集合{1,2,.,n }可以划分为若干个非空子集。
例如,当n=4 时,集合{1,2,3,4}可以划分为15个不同的非空子集如下:{1},{2},{3},{4}},{{1,2},{3},{4}},{{1,3},{2},{4}},{{1,4},{2},{3}},{{2,3},{1},{4}},{{2,4},{1},{3}},{{3,4},{1},{2}},{{1,2},{3,4}},{{1,3},{2,4}},{{1,4},{2,3}},{{1,2,3},{4}},{{1,2,4},{3}},{{1,3,4},{2}},{{2,3,4},{1}},{{1,2,3,4}}编程任务:给定正整数n 和m,计算出n 个元素的集合{1,2,., n }可以划分为多少个不同的由m 个非空子集组成的集合。
算法实验1穷举【参考答案】【最新完全版】
算法分析与设计实验一——穷举算法(黑体,三号)1.穷举简介(小标题:黑体,小四;内容:宋体,五号)穷举法又称列举法,其基本思想是逐一列举问题所涉及的所有情况。
从中寻找满足条件的结果。
适用于数量较小的问题。
2.算法流程或设计思想穷举通常应用循环结构来实现。
在循环体中,应用选择结构实施判断筛选,求得所要求的解。
使用穷举法的关键是要确定正确的穷举的范围。
3.分析算法的时间复杂度4.程序设计中的问题及解决方案5.运行说明(包括实验数据和结果说明)6.主要程序代码(添加程序注释)7.对比解决该问题的其他算法(选作)题目:1.有一堆零件(1000-5000个之间),如果以4个零件为一组进行分组,则多2个零件;如果以7个零件为一组进行分组,则多3个零件;如果以9个零件为一组进行分组,则多5个零件。
编程求解这堆零件总数。
参考答案:#include<stdio.h>void main(){int n,count=0;for(n=1000;n<=5000;n++)if(n%4==2&&n%7==3&&n%9==5){printf("%d ",n);count=count+1;if(count%5==0)printf("\n");}printf("\ncount = %d\n",count);}2.穷举三位数的水仙花数。
水仙花数是指一个n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身。
(例如:13 + 53 + 33 = 153)参考答案:/*2. 穷举三位数的水仙花数。
水仙花数是指一个n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身。
(例如:13 + 53 + 33 = 153)*/#include <stdio.h>void main(){int a,b,c,d;for(a=100;a<=999;a++){b=a/100;c=a/10-b*10;d=a-b*100-c*10;if(b*b*b+c*c*c+d*d*d==a)printf("%d = %d^3 + %d^3 + %d^3\n",a,b,c,d);}}3.穷举真分数递增序列中的第k项的值。
算法实验题目
5 变治法在排序问题中的应用 ——堆排序 堆排序
3. 实验要求 1)设计与实现堆排序算法; 2)待排序的数据可以手工输入(通常规模比较小,10个数 据左右),用以检测程序的正确性;也可以计算机随机生 成(通常规模比较大,1500-3000个数据左右),用以检 验(用计数法)堆排序算法的时间效率。
10/29/2010 2006 《Algorithm Design and Analysis》 SCUEC 》 11
6
动态规划法在图问题中的应用 ——全源最短路径问题 全源最短路径问题
3. 实验要求 (1)实现Floyd算法; (2)算法的输入可以手动输入,也可以自动生成; (3)算法不仅要输出从每个顶点到其他所有顶点之间 的最短路径,还有输出最短路径的长度; (4)设计一个权重为负的图或有向图的例子,对于它, Floyd算法不能输出正确的结果。
10/29/2010 2006 《Algorithm Design and Analysis》 SCUEC 》 4
3
分治法在数值问题中的应用 ——最近点对问题 最近点对问题
1. 实验题目 设p1 = (x1,y1), p2 = (x1, y2), ……, pn= (xn, yn)是平面上n个点 构成的集合S,设计算法找出集合S中距离最近的点对。 2.实验目的 1)提高应用蛮力法设计算法的技能; 2)深刻理解并掌握分治法的设计思想; 3)理解这样一个观点:用蛮力法设计的算法,一般来说, 经过适度的努力后,都可以对其进行改进,以提高算法的 效率。
10/29/2010 2006 《Algorithm Design and Analysis》 SCUEC 》 5
《算法设计与分析》课程实验报告 (分治法(三))
《算法设计与分析》课程实验报告实验序号:04实验项目名称:实验4 分治法(三)一、实验题目1.邮局选址问题问题描述:在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。
用x 坐标表示东西向,用y坐标表示南北向。
各居民点的位置可以由坐标(x,y)表示。
街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值∣x1−x2∣+∣y1−y2∣度量。
居民们希望在城市中选择建立邮局的最佳位置,使n个居民点到邮局的距离总和最小。
编程任务:给定n 个居民点的位置,编程计算邮局的最佳位置。
2.最大子数组问题问题描述:对给定数组A,寻找A的和最大的非空连续子数组。
3.寻找近似中值问题描述:设A是n个数的序列,如果A中的元素x满足以下条件:小于x的数的个数≥n/4,且大于x的数的个数≥n/4 ,则称x为A的近似中值。
设计算法求出A的一个近似中值。
如果A中不存在近似中值,输出false,否则输出找到的一个近似中值4.循环赛日程表问题描述:设有n=2^k个运动员要进行网球循环赛。
现要设计一个满足以下要求的比赛日程表:每个选手必须与其他n-1个选手各赛一次,每个选手一天只能赛一次,循环赛一共进行n-1天。
二、实验目的(1)进一步理解分治法解决问题的思想及步骤(2)体会分治法解决问题时递归及迭代两种不同程序实现的应用情况之差异(3)熟练掌握分治法的自底向上填表实现(4)将分治法灵活于具体实际问题的解决过程中,重点体会大问题如何分解为子问题及每一个大问题涉及哪些子问题及子问题的表示。
三、实验要求(1)写清算法的设计思想。
(2)用递归或者迭代方法实现你的算法,并分析两种实现的优缺点。
(3)根据你的数据结构设计测试数据,并记录实验结果。
(4)请给出你所设计算法的时间复杂度的分析,如果是递归算法,请写清楚算法执行时间的递推式。
四、实验过程(算法设计思想、源码)1.邮局选址问题(1)算法设计思想根据题目要求,街区中任意2 点(x1,y1)和(x2,y2)之间的距离可以用数值∣x1−x2∣+∣y1−y2∣度量。
算法分析实验题目
一、算法设计与分析基础(21周前交,要求上交源代码,需要实验报告,语言不限)编程实现:1、计算两个不全为0的非负整数m和n的最大公约数(1) 用欧几里德算法实现;(2) 用连续整数检测算法实现;(3) 用质因数分解算法实现;2、Horspool算法(Page 195)3、BM算法(Page 197)最大公约数定义:两个不全为0的非负整数m和n的最大公约数记为gcd(m,n),代表能够整除(即余数为0)m和n的最大正整数。
--------------------------------------------------------------------------------一、欧几里得算法第一步:如果n=0,返回m的值作为结果,同时过程结束;否则进入第二步第二步:m除以n,将余数赋给r第三步:将n的值赋给m,将r的值赋给n,返回第一步算法Euclid(m,n)//使用欧几里德算法计算gcd(m,n)//输入:两个不全为0的非负整数m,n//输出:m,n的最大公约数if n=0return nwhile n!=0 dor←m mod nm←nn←rreturn n--------------------------------------------------------------------------------二、连续整数检测法第一步:将min{m,n}的值赋给t第二步:m除以t,如果余数为0,进入第三步;否则进入第四步第三步:n除以t,如果余数为0,返回t的值作为结果;否则进入第四步第四步:把t的值减1。
返回第二步算法://使用连续整数检测法计算gcd(m,n)//输入:两个不全为0的非负整数m,n//输出:m,n的最大公约数if n=0 return nt=min{m,n}while t>0 doif (m mod t)==0if (n mod t)==0return telse t=t-1else t=t-1return t--------------------------------------------------------------------------------三、中学中计算gcd(m,n)的过程第一步:找到m的所有质因数第二步:找到n的所有质因数第三步:从第一步和第二步求得的质因数分解式中找出所有的公因数(如果p是一个公因数,而且在m和n的质因数分解式分别出现过pm和pn次,那么应该将p重复min{pm,pn}次)第四步:将第三步中找到的质因数相乘,其结果作为给定数字的最大公约数Horspool算法这个算法是由R.Nigel Horspool在1980年提出的。
算法分析与设计-有重复元素的排列问题
算法设计实验报告题目:有重复元素的排列问题年月日一、实验题目有重复元素的排列问题二、实验目的问题描述:设R={r1,r2,...,rn}是要进行排列的n个元素。
其中元素r1,r2,...,rn可能相同。
试设计一个算法,列出R的所有不同排列。
三、实验内容算法设计:给定n及待排列的n个元素。
计算出这n个元素的所有不同排列。
数据输入:由文件input.txt提供输入数据。
文件的第1行是元素个数n,1<=n<=500。
接下来的1行是待排列的n个元素。
结果输出:将计算出的n个元素的所有不同排列输出到文件output.txt。
文件最后1行中的数是排列总数。
输入文件示例输出文件示例input.txt output.txt4 aaccaacc acacaccacaaccacaccaa6四、实验原理1)aacc四个元素的全排列,我们可以划分为3个元素的全排列,3个划分为2个,到最后只剩下1个元素,就不需要排列。
2)让每一个元素作为打头元素,交换,然后进行递归,再交换。
3)如果该打头元素在前面中已经有过,则忽略这种情况。
五、实验步骤1)实现环境:Microsoft Visual Studio 20102)编写代码,在程序文件夹下建立input.txt,output.txt,输入问题,运行,发现错误不断调试3)实验代码:#include<iostream>#include<stdio.h>#include<string>#include<cstring>#include<algorithm>using namespace std;char a[1000];char b[1000];int main() {freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);int n;scanf("%d",&n);scanf("%s",&a);sort(a,a+n);for(int i=0;i<n;i++){b[n-i-1]=a[i];}for(int i=0;i<n;i++){printf("%c",b[i]);}printf("\n");int t=1;while(strcmp(a,b)){t++;for(int i=0;i<n;i++){printf("%c",a[i]);}printf("\n");next_permutation(a,a+n);} for(int i=0;i<n;i++) {printf("%c",b[i]);}printf("\n");printf("%d",t);return 0;}六、实验结果分析运行结果截图:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法实验整体框架的构建
3. 实验要求 1)设计的主菜单可以是图形模式的,也可以是控制台模式的。以控制 台为例,主菜单大致如下:
------------------------- 《算法设计与分析》实验 ------------------------- 1. 算法分析基础——Fibonacci序列问题 2. 分治法在数值问题中的应用——最近点对问题 3. 减治法在组合问题中的应用——8枚硬币问题 4. 变治法在排序问题中的应用——堆排序问题 5. 动态规划法在图问题中的应用——全源最短路径问题 99. 退出本实验 ------------------------- 请输入您所要执行的操作(1,2,3,4,5,99):
3/14/2011 2006 《Algorithm Design and Analysis》 SCUEC 》 6
4
减治法在组合问题中的应用 ——8枚硬币问题 8
1. 实验题目 在8枚外观相同的硬币中,有一枚是假币,并且已知假 币与真币的重量不同,但不知道假币与真币相比较轻还是 较重。可以通过一架天平来任意比较两组硬币,设计一个 高效的算法来检测这枚假币。 2.实验目的 2.实验目的 1)深刻理解并掌握减治法的设计思想并理解它与分治法 的区别; 2)提高应用减治法设计算法的技能。 3)理解这样一个观点:建立正角的模型对于问题的求解 是非常重要的。
3/14/2011 2006 《Algorithm Design and Analysis》 SCUEC 》 9
5 变治法在排序问题中的应用 ——堆排序 堆排序
3. 实验要求 1)设计与实现堆排序算法; 2)待排序的数据可以手工输入(通常规模比较小,10个数 据左右),用以检测程序的正确性;也可以计算机随机生 成(通常规模比较大,1500-3000个数据左右),用以检 验(用计数法)堆排序算法的时间效率。
2)点击操作后进入相应的实验项目或是相应项目的下一级菜单; 3)可以反复执行,直到退出实验。
3/14/2011 2006 《Algorithm Design and Analysis》 SCUEC 》 2
2 算法分析基础
1. 实验题目 给定一个非负整数n,计算第n个Fibonacci数 2.实验目的 . 1)理解递归算法和迭代算法的设计思想以及递归程序的 调式技术 2)掌握并应用递归算法和迭代算法效率的理论分析(前验分 析)和实际分析(后验分析)方法; 3)理解这样一个观点:不同的算法可以解决相同的问题, 这些算法的解题思路不同,复杂程度不同,效率也不同;
3/14/2011 2006 《Algorithm Design and Analysis》 SCUEC 》 8
5 变治法在排序问题中的应用 ——堆排序 堆排序
1. 实验题目 用基于变治法的堆排序算法对任意一组给定的数据进 行排序 2.实验目的 . 1)深刻理解并掌握变治法的设计思想; 2)掌握堆的概念以及如何用变治法把任意给定的一组数 据改变成堆; 3)提高应用变治法设计算法的技能。
3/14/2011
2006 《Algorithm Design and Analysis》 SCUEC 》
12
3/14/2011 2006 《Algorithm Design and Analysis》 SCUEC 》 7
4
减治法在组合问题中的应用 ——8枚硬币问题 8
3. 实验要求 1)设计减治算法实现8枚硬币问题; 2)设计实验程序,考察用减治技术设计的算法是否高效; 3)扩展算法,使之能处理n枚硬币中有一枚假币的问题。 4. 实现提示 假设用一个数组B[n]表示硬币,元素B[i]中存放第i枚硬币 的重量,其中n-1个元素的值都是相同的,只有一个元素与 其他元素值不同,则当n=8时即代表8枚硬币问题。由于8枚 硬币问题限制只允许使用天平比较轻重,所以,算法中只 能出现元素相加和比较的语句。
3/14/2011 2006 《Algorithm Design and Analysis》 SCUEC 》 5
3
分治法在数值问题中的应用 ——最近点对问题 最近点对问题
3. 实验要求 1)设计并实现用BF方法求解最近点对问题的算法; 2)设计并实现用DAC方法求解最近点对问题的算法; 3)以上两种算法的输入既可以手动输入,也可以自动生成; 4)算法不仅要输出最近点对的距离,还要输出最近点对的 两个点; 5)对上述两个算法进行时间复杂性分析,并设计实验程序验证 分析结果; 6)设计可供用户选择算法的交互式菜单(放在相应的主菜单下)。
3/14/2011
2006 《Algorithm Design and Analysis》 SCUEC 》
10
6
动态规划法在图问题中的应用 ——全源最短路径问题 全源最短路径问题
1. 实验题目 给定一个加权连通图(无向的或有向的),要求找出从 每个定点到其他所有定点之间的最短路径以及最短路径的 长度。 2.实验目的 . (1)深刻掌握动态规划法的设计思想并能熟练运用,理 解它与分治法的区别; (2)掌握最优性原理和最优子结构性质; (3)理解这样一个观点:用动态规划方法求解问题的关 键在于确定动态规划函数的递推式。
3/14/2011 2006 《Algorithm Design and Analysis》 SCUEC 》 4
3
分治法在数值问题中的应用 ——最近点对问题 最近点对问题
1. 实验题目 设p1 = (x1,y1), p2 = (x1, y2), ……, pn= (xn, yn)是平面上n个点 构成的集合S,设计算法找出集合S中距离最近的点对。 2.实验目的 1)提高应用蛮力法设计算法的技能; 2)深刻理解并掌握分治法的设计思想; 3)理解这样一个观点:用蛮力法设计的算法,一般来说, 经过适度的努力后,都可以对其进行改进,以提高算法的 效率。
1
算法实验整体框架的构建
1. 实验题目 算法实验主菜单的设计。 2.实验目的 ⑴ 熟悉实验环境VC++6.0 ; ⑵ 复习C、C++语言以及数据结构课程的相关知识, 实现课程间的平滑过度;
3/14/2011
2006 《Algorithm Design and Analysis》 SCUEC 》
1
1
3/14/2011 2006 《Algorithm Design and Analysis》 SCUEC 》 3
2 算法分析基础
3. 实验要求 1)使用教材2.5节中介绍的迭代算法Fib(n),找出最大的n,使得 第n个Fibonacci数不超过计算机所能表示的最大整数,并给出具 体的执行时间; 2)对于要求1),使用教材2.5节中介绍的递归算法F(n)进行计算,同 样给出具体的执行时间,并同1)的执行时间进行比较; 3)对于输入同样的非负整数n,比较上述两种算法基本操作的执 行次数; 4)对1)中的迭代算法进行改进,使得改进后的迭代算法其空间 复杂度为Θ(1); 5)设计可供用户选择算法的交互式菜单(放在相应lgorithm Design and Analysis》 SCUEC 》 11
6
动态规划法在图问题中的应用 ——全源最短路径问题 全源最短路径问题
3. 实验要求 (1)实现Floyd算法; (2)算法的输入可以手动输入,也可以自动生成; (3)算法不仅要输出从每个顶点到其他所有顶点之间 的最短路径,还有输出最短路径的长度; (4)设计一个权重为负的图或有向图的例子,对于它, Floyd算法不能输出正确的结果。