向前和向后处理多段图的算法设计和实现
- 格式:docx
- 大小:18.85 KB
- 文档页数:6
并行计算第七章并行算法常用设计技术在并行计算中,算法的设计是非常重要的,旨在提高计算速度和效率。
本章将介绍几种常用的并行算法设计技术,包括任务划分、任务调度和数据划分等。
这些技术可以帮助程序员实现高性能的并行计算。
一、任务划分任务划分是指将一个大型计算任务拆分成多个小任务,并分配给多个处理单元并行执行。
常见的任务划分策略有以下几种:1.分治法:将大问题划分成多个子问题,并分别解决。
该方法适用于问题可以被分解成一系列独立的子问题的情况。
例如,计算斐波那契数列可以使用分治法将其拆分成多个子问题,并分配给多个处理单元计算。
2.流水线:将一个长任务划分成多个子任务,并按照流水线的方式依次执行。
每个处理单元处理一个子任务,并将结果传递给下一个处理单元。
流水线技术适用于具有顺序执行步骤的应用,例如图像处理和视频编码。
3.数据并行:将输入数据划分成多个子数据集,并分配给多个处理单元并行处理。
每个处理单元只操作自己分配的子数据集,然后将结果合并。
数据并行可以提高计算速度和处理能力,适用于数据密集型应用,例如矩阵运算和图像处理。
二、任务调度任务调度是指为每个任务分配合适的处理单元,并按照一定的策略进行调度和管理。
常见的任务调度策略有以下几种:1.静态调度:在程序开始执行之前,根据预先设定的规则将任务分配给处理单元。
静态调度可以提高计算效率,但不适用于动态变化的任务。
2.动态调度:根据运行时的情况动态地调整任务的分配和调度。
动态调度可以根据负载情况来实时调整任务的分配,提高系统的整体性能。
3.动态负载平衡:将任务合理地分配给多个处理单元,使得每个处理单元的负载尽可能均衡。
动态负载平衡可以避免单个处理单元负载过重或过轻的情况,提高计算效率。
三、数据划分数据划分是指将输入数据划分成多个部分,并分配给多个处理单元。
常见的数据划分策略有以下几种:1.均匀划分:将输入数据均匀地划分成多个部分,并分配给多个处理单元。
均匀划分可以实现负载均衡,但可能导致通信开销增加。
向前和向后处理多段图的算法设计和实现//多段图问题的动态规划算法设计与实现#include"stdio.h"#include"conio.h"#include"stdlib.h"#define n 12 /*图的顶点数*/#define k 5 /*图的段数*/#define MAX 1000typedef int NodeNumber; /*节点编号*/typedef int CostType; /*成本值类型*/CostType cost[n][n];NodeNumber path[k]; /*存储最短路径的数组*/ NodeNumber cur= -1;void creatgraph(CostType cost[n][n]) /*创建图的成本矩阵*/ {int i,j;printf("请输入图的成本矩阵:\n");for(i=0;i<n;i++)< p="">for(j=0;j<n;j++)< p="">scanf("%d",&cost[i][j]);}void outgraph(CostType cost[n][n]) /*输出图的成本矩阵*/ {int i,j;printf("输出图的成本矩阵:\n");for(i=0;i<n;i++)< p="">{for(j=0;j<n;j++)< p="">printf("%3d",cost[i][j]);printf("\n");}}/* 使用向前递推算法求多段图的最短路径*/void FPath(CostType cost[n][n],NodeNumber path[k]) {int i,j,length,temp,v[n],d[n];for(i=0;ifor(i=n-2;i>=0;i--){for(length=MAX,j=i+1;j<=n-1;j++)if(cost[i][j]>0 && (cost[i][j])+v[j]<length)< p=""> {length=cost[i][j]+v[j];temp=j;}v[i]=length;d[i]=temp;}path[0]=0;path[k-1]=n-1;for(i=1;i<=k-2;i++)(path[i])=d[path[i-1]];printf("\n请输出选择V[i]:\n");for(i=0;i<n-1;i++)< p="">printf("%3d",v[i]);printf("\n------------------------------------------\n"); printf("\n请输出决策D[i]:\n");for(i=0;i<n-1;i++)< p="">printf("%3d",d[i]);printf("\n------------------------------------------\n");}/* 使用向后递推算法求多段图的最短路径*/void BPath(CostType cost[n][n],NodeNumber path[k]) {int i,j,length,temp,v[n],d[n];for(i=0;i<="">for(i=1;i<=n-1;i++){for(length=MAX,j=i-1;j>=0;j--)if(cost[j][i]>0 && (cost[j][i])+v[j]<length)< p="">{length=cost[j][i]+v[j];temp=j;}v[i]=length;d[i]=temp;}path[0]=0;path[k-1]=n-1;for(i=k-2;i>=1;i--)(path[i])=d[path[i+1]];printf("\n请输出选择V[i]:\n");for(i=n-1;i>0;i--)printf("%3d",v[i]);printf("\n------------------------------------------\n"); printf("\n请输出决策D[i]:\n");for(i=n-1;i>0;i--)printf("%3d",d[i]);printf("\n------------------------------------------\n");}/* 查找结点i的后向邻接结点*/int findbackward(CostType cost[n][n],NodeNumber i,NodeNumber cur) {int j;for(j=cur+1;j<n;j++)< p="">if(cost[i][j]>0){cur=j;return j;}return -1;}/* 查找结点i的前向邻接结点*/int findforward(CostType cost[n][n],NodeNumber i,NodeNumber cur) {int j;for(j=cur+1;j<n;j++)< p="">if(cost[j][i]>0){cur=j;return j;}return -1;}/* 输出最短路径序列*/void outpath(NodeNumber path[k]){int i;for(i=0;i<k;i++)< p="">printf("%d\t",path[i]);}void main(){NodeNumber m,t;//调用creatgraph函数。
课程代码:《算法分析设计》课程实验教学大纲【编写】朱少林【审核】【课程类别】专业选修【课程学时】 34【开课学期】【实验学时】 16 - 34【授课专业】电子商务/信息管理/计算机科学与技术一、实验教学任务和目的无论是在计算机科学与技术的研究中,还是在计算机应用(包括管理信息系统和电子商务系统开发)中,都涉及大量的程序设计问题,而且随着研究和应用的深入,所遇到的问题越来复杂,对处理问题的效率要求也越来越高,了解和掌握求解问题的方法(算法)、设计出好的算法也就成为解决这些问题的关键,甚至成为其决定因素。
《算法分析与设计》课程的主要内容是讲授在计算机科学研究和应用中经常用到的一些算法,包括分枝法、贪心法、动态规划法、回溯法等,介绍这些算法设计的思路和算法的一般框架,并针对多个具体的应用问题设计出了相应算法。
其目的就是让学过该课程的学生掌握算法设计的基本思想和技巧,掌握几个基本和常用的算法。
《算法分析与设计》是一门实践性很强的课程,课程教学过程中,需要与课程实验相结合。
算法分析与设计实验的主要任务是针对给定的问题,设计出一个合适的算法或几个可供选择的算法,然后将算法用合适的程序设计语言实现并上机调试,并用合适的数据验证运行。
只有通过实验,通过让学生进行算法设计和编程实践并上机验证,才能让学生理解算法的思想,掌握算法设计的方法和掌握算法的精髓。
同时,通过算法实验,让学生掌握调试程序、改进算法的方法,学会通过对比选择最适合问题求解算法的方法;使学生将以前所学如《C语言程序设计》、《数据结构》等课程知识能有机结合并融会贯通;进一步培养学生的分析问题、解决问题的能力,提高学生素质,使其能更好地适应社会,满足社会对人才的需求。
二、实验教学基本要求1.程序设计语言与实验要求算法实验需要将算法转换成程序并上机验证,实验的主要工作是验证算法的正确性并测试算法的时空复杂度。
学生可以根据自己的喜好或对程序设计语言的掌握程度选择一个程序设计语言,如C/C++、PASSCAL等支持递归程序设计的语言,实验硬件环境要求是支持学生选定程序设计语言的计算机系统,(包含打印机更佳),学生应能熟练掌握计算机系统的使用,并具备熟练编写、输入和调试程序的能力。
前后向平滑算法前向平滑算法和后向平滑算法是一种常用的语言模型训练算法,用于生成自然语言文本。
这两种算法在自然语言处理领域中被广泛应用,可以用于机器翻译、语音识别、文本生成等任务。
本文将分别介绍前向平滑算法和后向平滑算法的原理和应用。
一、前向平滑算法前向平滑算法是一种统计语言模型训练算法,用于计算一个句子的概率。
它通过统计已知词的出现频率,来估计未知词的概率。
具体而言,前向平滑算法通过计算词的条件概率来估计整个句子的概率。
前向平滑算法的原理如下:首先,对于每个已知的词,统计它的出现次数,并计算它的条件概率。
然后,对于一个给定的句子,将句子中的每个词的条件概率相乘,得到整个句子的概率。
最后,通过对所有词的概率求和,得到整个语料库的概率。
前向平滑算法的优点是简单高效,可以快速计算一个句子的概率。
然而,它也存在一些问题。
首先,对于未知的词,前向平滑算法无法给出准确的概率估计。
其次,前向平滑算法对于长句子的计算开销较大,容易出现数值下溢问题。
二、后向平滑算法后向平滑算法是一种改进的语言模型训练算法,用于解决前向平滑算法存在的问题。
后向平滑算法通过引入上下文信息,来提高对未知词的概率估计准确性。
后向平滑算法的原理如下:首先,对于每个未知的词,统计它在上下文中的出现次数,并计算它的条件概率。
然后,对于一个给定的句子,将句子中的每个词的条件概率相乘,得到整个句子的概率。
最后,通过对所有词的概率求和,得到整个语料库的概率。
后向平滑算法相对于前向平滑算法的优点是能够更准确地估计未知词的概率。
它利用上下文信息对未知词进行推测,提高了模型的准确性。
然而,后向平滑算法的计算开销较大,需要对每个未知词进行条件概率的计算,因此在大规模语料库上的应用存在一定挑战。
三、应用领域前向平滑算法和后向平滑算法在自然语言处理领域有着广泛的应用。
它们可以用于机器翻译、语音识别、文本生成等任务。
在机器翻译任务中,前向平滑算法和后向平滑算法可以用于计算一个句子在源语言和目标语言之间的对应概率,进而用于翻译模型的训练和推断。
图像处理算法的并行计算优化方法和技巧随着图像处理的广泛应用和数据量的增加,对于图像处理算法的计算效率要求也越来越高。
并行计算是提高图像处理算法计算效率的主要方法之一。
本文主要探讨图像处理算法的并行计算优化方法和技巧,以满足对计算效率的要求。
在进行图像处理算法的并行计算优化之前,我们首先需要了解图像处理算法的特点。
通常,图像处理算法通过对每个像素点进行操作来达到图像处理的目的。
这意味着图像处理算法之间是高度并行且可以独立计算的。
基于这个特点,我们可以采用以下方法来实现图像处理算法的并行计算优化。
首先,对于图像处理算法的并行计算优化,我们可以利用多线程技术。
多线程技术是一种将一个进程分成多个线程,每个线程执行不同的任务的方法。
在图像处理算法中,可以将图像划分成多个块,每个线程负责处理一个块的图像数据。
通过利用多线程,可以充分利用计算资源,提高算法的计算效率。
其次,我们还可以利用多核处理器来进行图像处理算法的并行计算优化。
现代计算机中大多数的处理器都是多核处理器,多核处理器可以并行地执行多个任务。
因此,我们可以将图像处理算法的不同部分分配给不同的核心来并行处理。
通过这种方式,可以进一步提高图像处理算法的计算效率。
此外,利用图像处理算法的局部性特点也是图像处理算法并行计算优化的重要方法之一。
图像处理算法通常会在邻近的像素之间进行计算。
因此,我们可以将图像数据按照一定的规则划分成多个子区域,并将每个子区域分配给不同的处理单元来并行计算。
通过这种方式,可以减少不同处理单元之间的通信开销,提高算法的计算效率。
并行计算优化还可以通过数据并行和任务并行两种方式来实现。
在数据并行中,不同的处理单元并行计算相同的算法,但对不同的数据进行处理。
而在任务并行中,不同的处理单元并行计算不同的算法,但对相同的数据进行处理。
具体选择哪种方式取决于算法的特点和需求。
此外,针对图像处理算法的具体特点,我们还可以采用一些特定的技巧来优化并行计算。
conv算法步骤引言conv算法是一种用于图像处理和计算机视觉任务的常见算法,它在图像分类、目标检测、图像分割等任务中取得了很好的效果。
本文将详细介绍conv算法的步骤以及每个步骤的实现细节。
什么是conv算法?conv(卷积)算法是一种用于图像处理和计算机视觉任务的基本算法。
它模仿人类视觉系统的方式对图像进行分析和处理。
conv算法的核心思想是使用滤波器对输入图像进行卷积运算,从而提取特征并用于后续的任务。
conv算法步骤conv算法通常包含以下几个步骤:1.图像预处理在开始应用conv算法之前,通常需要对图像进行预处理。
这包括将图像转换为灰度图像、归一化图像像素值等。
预处理步骤的目的是提高算法的鲁棒性和减少噪声的影响。
2.设计滤波器滤波器是conv算法的核心组件之一。
它用于在图像上进行卷积运算,从而提取图像中的特征。
设计合适的滤波器对算法的性能和效果至关重要。
常见的滤波器设计方法包括手动设计和自动学习。
3.卷积运算在这一步骤中,滤波器将应用于图像上的每个像素。
滤波器在图像上滑动,与每个像素进行卷积运算,计算得到一个特征图。
特征图是对输入图像的一种表征,其中每个像素值表示滤波器在对应位置检测到的特征强度。
4.激活函数卷积运算后,通常会对特征图应用非线性激活函数。
这样可以增强特征的非线性表达能力,并且能够使得神经网络更好地适应复杂的数据。
5.池化操作池化是conv算法中的常见操作,它用于缩减特征图的尺寸和数量。
常见的池化操作包括最大池化和平均池化。
池化操作可以减少计算量、提高计算效率,并且能够提取更加鲁棒的特征。
6.全连接层在经过卷积和池化操作之后,通常会将特征图展开,并将其作为输入送入全连接层。
全连接层是一个多层感知器,它可以通过学习权重和偏置来建立特征与输出之间的映射关系。
全连接层可以实现更加复杂的分类、检测或分割任务。
7.输出层输出层是conv算法的最后一层,它用于生成最终的预测结果。
输出层的结构和激活函数取决于具体的任务类型。
实验一找最大和最小元素与归并分类算法实现(用分治法)一、实验目的1.掌握能用分治法求解的问题应满足的条件;2.加深对分治法算法设计方法的理解与应用;3.锻炼学生对程序跟踪调试能力;4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力。
二、实验内容1、找最大和最小元素输入n 个数,找出最大和最小数的问题。
2、归并分类将一个含有n个元素的集合,按非降的次序分类(排序)。
三、实验要求(1)用分治法求解问题(2)上机实现所设计的算法;四、实验过程设计(算法设计过程)1、找最大和最小元素采用分治法,将数组不断划分,进行递归。
递归结束的条件为划分到最后若为一个元素则max和min都是这个元素,若为两个取大值赋给max,小值给min。
否则就继续进行划分,找到两个子问题的最大和最小值后,比较这两个最大值和最小值找到解。
2、归并分类使用分治的策略来将一个待排序的数组分成两个子数组,然后递归地对子数组进行排序,最后将排序好的子数组合并成一个有序的数组。
在合并过程中,比较两个子数组的首个元素,将较小的元素放入辅助数组,并指针向后移动,直到将所有元素都合并到辅助数组中。
五、源代码1、找最大和最小元素#include<iostream>using namespace std;void MAXMIN(int num[], int left, int right, int& fmax, int& fmin); int main() {int n;int left=0, right;int fmax, fmin;int num[100];cout<<"请输入数字个数:";cin >> n;right = n-1;cout << "输入数字:";for (int i = 0; i < n; i++) {cin >> num[i];}MAXMIN(num, left, right, fmax, fmin);cout << "最大值为:";cout << fmax << endl;cout << "最小值为:";cout << fmin << endl;return 0;}void MAXMIN(int num[], int left, int right, int& fmax, int& fmin) { int mid;int lmax, lmin;int rmax, rmin;if (left == right) {fmax = num[left];fmin = num[left];}else if (right - left == 1) {if (num[right] > num[left]) {fmax = num[right];fmin = num[left];}else {fmax = num[left];fmin = num[right];}}else {mid = left + (right - left) / 2;MAXMIN(num, left, mid, lmax, lmin);MAXMIN(num, mid+1, right, rmax, rmin);fmax = max(lmax, rmax);fmin = min(lmin, rmin);}}2、归并分类#include<iostream>using namespace std;int num[100];int n;void merge(int left, int mid, int right) { int a[100];int i, j,k,m;i = left;j = mid+1;k = left;while (i <= mid && j <= right) {if (num[i] < num[j]) {a[k] = num[i++];}else {a[k] = num[j++];}k++;}if (i <= mid) {for (m = i; m <= mid; m++) {a[k++] = num[i++];}}else {for (m = j; m <= right; m++) {a[k++] = num[j++];}}for (i = left; i <= right; i++) { num[i] = a[i];}}void mergesort(int left, int right) { int mid;if (left < right) {mid = left + (right - left) / 2;mergesort(left, mid);mergesort(mid + 1, right);merge(left, mid, right);}}int main() {int left=0,right;int i;cout << "请输入数字个数:";cin >> n;right = n - 1;cout << "输入数字:";for (i = 0; i < n; i++) {cin >> num[i];}mergesort(left,right);for (i = 0; i < n; i++) {cout<< num[i];}return 0;}六、运行结果和算法复杂度分析1、找最大和最小元素图1-1 找最大和最小元素结果算法复杂度为O(logn)2、归并分类图1-2 归并分类结果算法复杂度为O(nlogn)实验二背包问题和最小生成树算法实现(用贪心法)一、实验目的1.掌握能用贪心法求解的问题应满足的条件;2.加深对贪心法算法设计方法的理解与应用;3.锻炼学生对程序跟踪调试能力;4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力。
先张法和后张法的基本原理先张法和后张法是针对图像处理中的图像缩放操作而言的,它们的基本原理是不同的。
先张法和后张法在实现上有所不同,但它们都是为了解决图像缩放时出现的锯齿、失真等问题而设计的。
一、先张法1.1 基本概念先张法(Upsampling)是指在进行图像缩放时,首先将原始图像进行插值等操作,得到一个比原始图像更大、更精细的中间结果,然后再对这个中间结果进行滤波等处理,最终得到所需尺寸的图像。
1.2 具体实现具体来说,先张法可以通过以下步骤实现:(1)将原始图像按照所需缩放比例进行插值操作,得到一个比原始图像更大、更精细的中间结果;(2)对这个中间结果进行滤波操作,去除锯齿、失真等问题;(3)将滤波后的中间结果按照所需尺寸进行裁剪或者缩小操作,得到最终所需尺寸的图像。
1.3 优点与缺点先张法能够有效地解决图像缩放时出现的锯齿、失真等问题,使得缩放后的图像更加清晰、自然。
但是,先张法需要进行插值和滤波等操作,计算量较大,处理时间较长。
二、后张法2.1 基本概念后张法(Downsampling)是指在进行图像缩放时,首先将原始图像按照所需尺寸进行缩小操作,然后再对缩小后的图像进行插值等处理,得到一个比原始图像更大、更精细的中间结果。
2.2 具体实现具体来说,后张法可以通过以下步骤实现:(1)将原始图像按照所需尺寸进行缩小操作;(2)对缩小后的图像进行插值操作,得到一个比原始图像更大、更精细的中间结果;(3)对这个中间结果进行滤波操作,去除锯齿、失真等问题。
2.3 优点与缺点相比于先张法,后张法计算量较小、处理速度较快。
但是,在对缩小后的图像进行插值时容易出现锯齿、失真等问题。
在实际应用中需要根据具体情况选择合适的方法。
三、先张法和后张法的选择在实际应用中,选择先张法还是后张法取决于具体情况。
如果需要对图像进行缩放并且要求缩放后的图像质量较高,可以选择先张法;如果需要对图像进行快速缩放并且对图像质量要求不高,可以选择后张法。
//多段图问题的动态规划算法设计与实现#include"stdio.h"#include"conio.h"#include"stdlib.h"#define n 12 /*图的顶点数*/#define k 5 /*图的段数*/#define MAX 1000typedef int NodeNumber; /*节点编号*/typedef int CostType; /*成本值类型*/CostType cost[n][n];NodeNumber path[k]; /*存储最短路径的数组*/NodeNumber cur= -1;void creatgraph(CostType cost[n][n]) /*创建图的成本矩阵*/{int i,j;printf("请输入图的成本矩阵:\n");for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%d",&cost[i][j]);}void outgraph(CostType cost[n][n]) /*输出图的成本矩阵*/{int i,j;printf("输出图的成本矩阵:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%3d",cost[i][j]);printf("\n");}}/* 使用向前递推算法求多段图的最短路径*/void FPath(CostType cost[n][n],NodeNumber path[k]){int i,j,length,temp,v[n],d[n];for(i=0;i<n;i++) v[i]=0;for(i=n-2;i>=0;i--){for(length=MAX,j=i+1;j<=n-1;j++)if(cost[i][j]>0 && (cost[i][j])+v[j]<length){length=cost[i][j]+v[j];temp=j;}v[i]=length;d[i]=temp;}path[0]=0;path[k-1]=n-1;for(i=1;i<=k-2;i++)(path[i])=d[path[i-1]];printf("\n请输出选择V[i]:\n");for(i=0;i<n-1;i++)printf("%3d",v[i]);printf("\n------------------------------------------\n");printf("\n请输出决策D[i]:\n");for(i=0;i<n-1;i++)printf("%3d",d[i]);printf("\n------------------------------------------\n");}/* 使用向后递推算法求多段图的最短路径*/void BPath(CostType cost[n][n],NodeNumber path[k]){int i,j,length,temp,v[n],d[n];for(i=0;i<n;i++) v[i]=0; //矩阵元素全部赋初值为for(i=1;i<=n-1;i++){for(length=MAX,j=i-1;j>=0;j--)if(cost[j][i]>0 && (cost[j][i])+v[j]<length){length=cost[j][i]+v[j];temp=j;}v[i]=length;d[i]=temp;}path[0]=0;path[k-1]=n-1;for(i=k-2;i>=1;i--)(path[i])=d[path[i+1]];printf("\n请输出选择V[i]:\n");for(i=n-1;i>0;i--)printf("%3d",v[i]);printf("\n------------------------------------------\n"); printf("\n请输出决策D[i]:\n");for(i=n-1;i>0;i--)printf("%3d",d[i]);printf("\n------------------------------------------\n");}/* 查找结点i的后向邻接结点*/int findbackward(CostType cost[n][n],NodeNumber i,NodeNumber cur) {int j;for(j=cur+1;j<n;j++)if(cost[i][j]>0){cur=j;return j;}return -1;}/* 查找结点i的前向邻接结点*/int findforward(CostType cost[n][n],NodeNumber i,NodeNumber cur) {int j;for(j=cur+1;j<n;j++)if(cost[j][i]>0){cur=j;return j;}return -1;}/* 输出最短路径序列*/void outpath(NodeNumber path[k]){int i;for(i=0;i<k;i++)printf("%d\t",path[i]);}void main(){NodeNumber m,t;//调用creatgraph函数。
creatgraph(cost);//调用outgraph函数。
outgraph(cost);//调用FPath算法FPath(cost,path);printf("输出使用向前递推算法后的最短路径:\n");//输出最短成本路径。
outpath(path);//调用BPath算法。
BPath(cost,path);printf("\n输出使用向后递推算法后的最短路径:\n");//输出最短成本路径。
outpath(path);printf("\n输入要查找邻接结点的编号:");scanf("%d",&t);//调用findforward函数.printf("结点%d 的前向邻接结点为: \n",t);cur=findforward(cost,t,cur);/*找剩下的前向邻接结点*/while(cur!=-1){printf("%d\t",cur);cur=findforward(cost,t,cur);}//调用findbackward函数.printf("\n结点%d 的后向邻接结点为: \n",t);cur=findbackward(cost,t,cur);/*找剩下的后向邻接结点*/while(cur!=-1){printf("%d\t",cur);cur=findbackward(cost,t,cur);}//getch();printf("\n");system("pause");}请输入图的成本矩阵:0 9 7 3 2 0 0 0 0 0 0 0 0 0 0 0 0 4 2 1 0 0 0 0 0 0 0 0 0 2 7 0 0 0 0 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 0 0 0 11 8 0 0 0 0 0 0 0 0 0 0 0 0 6 5 0 0 0 0 0 0 0 0 0 0 4 3 0 0 0 0 0 0 0 0 0 0 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 输出图的成本矩阵:0 9 7 3 2 0 0 0 0 0 0 00 0 0 0 0 4 2 1 0 0 0 00 0 0 0 0 2 7 0 0 0 0 00 0 0 0 0 0 0 11 0 0 0 00 0 0 0 0 0 11 8 0 0 0 00 0 0 0 0 0 0 0 6 5 0 00 0 0 0 0 0 0 0 4 3 0 00 0 0 0 0 0 0 0 0 5 6 00 0 0 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 50 0 0 0 0 0 0 0 0 0 0 0请输出选择V[i]:16 7 9 18 15 7 5 7 4 2 5------------------------------------------请输出决策D[i]:1 6 5 7 7 9 9 9 11 11 11------------------------------------------输出使用向前递推算法后的最短路径:0 1 6 9 11请输出选择V[i]:16 16 14 15 10 11 9 2 3 7 9------------------------------------------请输出决策D[i]:9 7 6 6 4 1 2 0 0 0 0------------------------------------------输出使用向后递推算法后的最短路径:0 1 6 9 11输入要查找邻接结点的编号:9结点 9 的前向邻接结点为:5 6 7结点 9 的后向邻接结点为:11请按任意键继续. . .请输入图的成本矩阵:0 9 7 3 2 0 0 0 0 0 0 0 0 0 0 0 0 4 2 1 0 0 0 0 0 0 0 0 0 2 7 0 0 0 0 0 0 0 0 0 0 0 0 11 0 0 0 0 0 0 0 0 0 0 11 8 0 0 0 0 0 0 0 0 0 0 0 0 6 5 0 00 0 0 0 0 0 0 0 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 0 0 输出图的成本矩阵:0 9 7 3 2 0 0 0 0 0 0 00 0 0 0 0 4 2 1 0 0 0 00 0 0 0 0 2 7 0 0 0 0 00 0 0 0 0 0 0 11 0 0 0 00 0 0 0 0 0 11 8 0 0 0 00 0 0 0 0 0 0 0 6 5 0 00 0 0 0 0 0 0 0 4 3 0 00 0 0 0 0 0 0 0 0 5 6 00 0 0 0 0 0 0 0 0 0 0 40 0 0 0 0 0 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 50 0 0 0 0 0 0 0 0 0 0 0请输出选择V[i]:16 7 9 18 15 7 5 7 4 2 5------------------------------------------请输出决策D[i]:1 6 5 7 7 9 9 9 11 11 11------------------------------------------输出使用向前递推算法后的最短路径:0 1 6 9 11请输出选择V[i]:16 16 14 15 10 11 9 2 3 7 9------------------------------------------请输出决策D[i]:9 7 6 6 4 1 2 0 0 0 0------------------------------------------输出使用向后递推算法后的最短路径:0 1 6 9 11输入要查找邻接结点的编号:9结点 9 的前向邻接结点为:5 6 7结点 9 的后向邻接结点为:11请按任意键继续. . .。