算法分析 重庆邮电大学第一次实验
时空关联性分析方法研究与应用
时空关联性分析方法研究与应用摘要:随着信息技术、通讯技术、数字存储技术和高速数据获取技术的迅猛发展,在交通、电力、物流、环境监控、工业生产等领域积累了大量与时间和地理空间相关的数据资源,可这些随时随地获取的、呈爆炸性增长的数据资源在给我们带来丰富信息的同时,“数据越丰富,知识越贫乏”的问题则日益突出。
近年来,越来越多的学者认识到,通过研究空间对象随时间的变化规律,发现数据的时空关联规则,分析数据的时空变化趋势并预测未来的时空状态,对于规划建设、指挥调度、应急管理、信息服务等具有重要的应用价值。
本文研究的目的是面向智能交通领域,在时空关联性分析基础上,利用时空关联规则挖掘方法获取含时空约束的关联规则,从而进行交通拥堵趋势分析,为道路导航、趋势查询、交通控制等提供辅助决策信息。
时空关联性分析是研究空间对象随时间的变化规律,反映时空数据在时间和空间上的关联性,时空关联规则挖掘作为时空关联性分析的主要方法之一,目前已有不少学者对其进行了研究或应用。
本文详细介绍了时空关联规则挖掘的研究现状,通过分析现有时空关联规则算法在同时考虑时间和空间约束方面的不足,实现了一种新的时空关联规则挖掘方法。
文中首先对时空数据进行空间关联性分析和时间段划分形成事务表,然后对空间关联的项集进行连接并产生时空关联规则。
在算法执行过程中,对关联规则挖掘相关的阈值进行了分析,使挖掘所得的结果能更好的满足用户的需求。
算法分析和实验对比表明,同时考虑时间和空间约束,能够在分析过程中及时过滤不相关的数据,提高时空关联规则的获取效率,能够有效地发现时空关联规则。
在理论研究的基础上,本文设计并实现了一个基于时空关联规则分析交通拥堵趋势的原型系统,可有效地实现时空关联性分析和结果的可视化。
关键词:时空关联性分析,时空关联规则,可视化,阈值分析,交通拥堵时空关联性分析绪论当前像气象预报、环境监测和交通控制等领域,在问题的求解过程中越来越需要同时考虑时间和空间因素,而时空关联性分析的目标就是明确时空数据的时间有效性和空间可达性,从而在时间和空间上进行有效的趋势分析和预测。
重庆邮电大学-软件技术基础--实验报告(耿道渠)
《软件技术基础》实验报告实验名称:顺序表的操作班级学号姓名第9 周星期 2 、5,6 节成绩一、实验目的:1、掌握顺序表结构的实现方式;2、掌握顺序表常用算法的实现;3、熟悉利用顺序表解决问题的一般思路;4、参照给定的顺序表的程序样例,验证给出的顺序表的常见算法,领会顺序表结构的优点和不足。
二、实验内容:1、设计一个静态数组存储结构的顺序表,要求编程实现如下任务:(1)建立一个顺序表,首先依次输人整数数据元素(个数根据需要键盘给定)。
(2)删除指定位置的数据元素(指定元素位置通过键盘输入),再依次显示删除后的顺序表中的数据元素。
(3)查找指定数据的数据元素(指定数据由键盘输入),若找到则显示位置,若没有找到则显示0。
2、使用顺序表实现一个电话本的管理程序,电话本中的每条记录包括学号、姓名、手机号码和固定电话四项。
要求实现菜单、初始化、添加、删除和显示等功能。
三、实验结果:四、实验中遇到的问题及解决方法:第一次编写C++,感觉力不从心,回去多看看PPT。
五、实验心得体会:对顺序表的一些常用语句不熟悉,对顺序表的整体思路理解不深刻以后要加强练习附:源程序(自行编写或修改的程序。
若为修改程序请注明修改部分的功能,若为书上实例则可不附。
)#include <iostream>#include <string>#include <stdlib.h>#include <iomanip>#define MAXSIZE 20using namespace std;int num;typedef struct{string student_number;string name;string tel;string home_phone;int id;} TEL;void shuaxin(TEL *);void delet(TEL *);void find(TEL *);void show(TEL *);int main(void){int choose;TEL List[MAXSIZE];while(1){cout << "***************************欢迎来到XXX电话本系统*********************" << endl;cout << "1.初始化并建立" <<endl;cout << "2.删除" <<endl;cout << "3.查找" <<endl;cout << "4.显示全部" << endl <<endl;cin >> choose;system("cls");while( choose < 1 || choose > 4){cout << "输入错误,数字1-4,请重新输入!" << endl;cin >> choose;system("cls");}switch(choose){case 1: shuaxin(List); break;case 2: delet(List); break;case 3: find(List); break;case 4: show(List); break;}//system("cls");}return 0;}void shuaxin(TEL * list){int i,j;for(i = 0; i < MAXSIZE; i++){list[i].id = i + 1;list[i].home_phone = "none";list[i].name = "none";list[i].student_number = "none";list[i].tel = "none";system("cls");cout << "初始化成功,现在开始建表:" << endl;cout << "请输入需要建立的电话个数:(小于" << MAXSIZE << ")"<<endl;cin >> num;while( num < 1 || num > MAXSIZE ){system("cls");cout << "输入错误,请重新输入" << endl;cin >> num;}system("cls");cout << "请依次输入学生的学号,姓名,移动电话,家庭电话" << endl;for(j = 1; j <= num; j++){cout << j << '.';cin >> list[j - 1].student_number;cin >> list[j - 1].name;cin >> list[j - 1].tel;cin >> list[j - 1].home_phone;cout << endl;if(num == (j - 1) ){system("cls");cout << "建立表完毕!" << endl;}}void delet(TEL * list){int j,i = 0;cout << "请输入你需要删除的序号" << endl;cin >> j;while( j < 0 || j > num){cout << "输入错误,请重新输入" << endl;cin >> j;}while(list[i].id != j)i++;for(j = i; j < num - 1; j++){list[j].name = list[j + 1].name;list[j].tel = list[j + 1].tel;list[j].student_number = list[j + 1].student_number;list[j].home_phone = list[j + 1].home_phone;}list[j].home_phone = "none";list[j].name = "none";list[j].student_number = "none";list[j].tel = "none";num--;system("cls");cout << "删除完毕" << endl;}void find(TEL * list){string telnum;int i,key = 0;cout << "请输入你需要查找的电话号码" << endl;cin >> telnum;system("cls");for(i = 0; i < MAXSIZE; i++){if(telnum == list[i].tel || telnum == list[i].home_phone){if(key == 0)cout << "依次学号姓名移动电话家庭电话" << endl;cout << list[i].id << '.';cout << setw(12) << list[i].student_number;cout << setw(10) << list[i].name;cout << setw(14) << list[i].tel;cout << setw(10) << list[i].home_phone;cout << endl;key = 1;}}if( key == 0)cout << "未找到此电话号码" << endl;}void show(TEL * list){int i;cout << "现在有" << num << "个电话号码" << endl;cout << "依次学号姓名移动电话家庭电话" << endl;for(i = 0; i < num; i++){cout << list[i].id << '.';cout << setw(12) << list[i].student_number;cout << setw(10) << list[i].name;cout << setw(14) << list[i].tel;cout << setw(10) << list[i].home_phone;cout << endl;}cout << "输出完毕" << endl;}《软件技术基础》实验报告实验名称:链表的操作(一)班级学号姓名第10 周星期 2 、5,6 节成绩一、实验目的:1、掌握单链表结构的实现方式;2、掌握单链表常用算法的实现。
算法分析 重庆邮电大学第一次实验
实验四贪心算法求解最短路径问题实验目的:1)以解决最短路径问题为例,掌握贪心算法的基本设计策略;2)掌握Dijkstra贪心法求解单源点最短路径问题并实现;3)分析实验结果。
实验环境计算机、C语言程序设计环境实验学时2学时实验内容与步骤1.准备实验数据假设算法要处理下图,需要把图数据组织存放到相应的数据结构中,如:权值矩阵float graph[maxsize][maxsize]。
2.实现Dijkstra算法代码:#include <iostream>#include <fstream>#include <string>using namespace std;const int N = 6;const int M = 1000;ifstream fin("e://4d5.txt");ofstream fout("e://dijkstra-output1.txt");template<class Type>void Dijkstra(int n,int v,Type dist[],int prev[],Type c[][N+1]);void Traceback(int v,int i,int prev[]);//输出最短路径v源点,i终点int main(){int v = 1;//源点为1int dist[N+1],prev[N+1],c[N+1][N+1];cout<<"有向图权的矩阵为:"<<endl;for(int i=1; i<=N; i++){for(int j=1; j<=N; j++){fin>>c[i][j];cout<<c[i][j]<<" ";}cout<<endl;}Dijkstra(N,v,dist,prev,c);for(int i1=2; i1<=N; i1++){fout<<"源点1到点"<<i1<<"的最短路径长度为:"<<dist[i1]<<",其路径为";cout<<"源点1到点"<<i1<<"的最短路径长度为:"<<dist[i1]<<",其路径为";Traceback(1,i1,prev);cout<<endl;fout<<endl;}return 0;}template<class Type>void Dijkstra(int n,int v,Type dist[],int prev[],Type c[][N+1]){bool s[N+1];for(int i=1; i<=n; i++){dist[i] = c[v][i];//dist[i]表示当前从源到顶点i的最短特殊路径长度s[i] = false;if(dist[i] == M){prev[i] = 0;//记录从源到顶点i的最短路径i的前一个顶点}else{prev[i] = v;}}dist[v] = 0;s[v] = true;for(int i1=1; i1<n; i1++){int temp = M;int u = v;//上一顶点//取出V-S中具有最短特殊路径长度的顶点ufor(int j=1; j<=n; j++){if((!s[j]) && (dist[j]<temp)){u = j ;temp = dist[j];}}s[u] = true;//根据作出的贪心选择更新Dist值for(int j1=1; j1<=n; j1++){if((!s[j1]) && (c[u][j1]<M)){Type newdist = dist[u] + c[u][j1];if(newdist < dist[j1]){dist[j1] = newdist;prev[j1] = u;}}}}}//输出最短路径v源点,i终点void Traceback(int v,int i,int prev[]){if(v == i){cout<<i;fout<<i;return;}Traceback(v,prev[i],prev);cout<<"->"<<i;fout<<"->"<<i;}结果:#include <iostream>#include <limits>#include <fstream>#include <string>using namespace std;ofstream fout("e://dijkstra-output2.txt");struct Node { //定义表结点int adjvex; //该边所指向的顶点的位置int weight;// 边的权值Node *next; //下一条边的指针};struct HeadNode{ // 定义头结点int nodeName; // 顶点信息int inDegree; // 入度int d; //表示当前情况下起始顶点至该顶点的最短路径,初始化为无穷大bool isKnown; //表示起始顶点至该顶点的最短路径是否已知,true表示已知,false表示未知int parent; //表示最短路径的上一个顶点Node *link; //指向第一条依附该顶点的边的指针};//G表示指向头结点数组的第一个结点的指针//nodeNum表示结点个数//arcNum表示边的个数void createGraph(HeadNode *G, int nodeNum, int arcNum) {cout << "开始创建图(" << nodeNum << ", " << arcNum << ")" << endl; //初始化头结点for (int i = 0; i < nodeNum; i++) {G[i].nodeName = i+1; //位置0上面存储的是结点v1,依次类推G[i].inDegree = 0; //入度为0G[i].link = NULL;}inta[6][6]={{0,999,15,999,999,999},{2,999,999,999,10,30},{999,4,0,999,99 9,10},{999,999,999,0,999,999},{999,999,999,15,0,999},{999,999,999,4,1 0,0}};for (int j = 0;j<6;j++) {for(int k=0;k<6;k++){int begin, end, weight;begin = j+1;end=k+1;weight= a[j][k];// 创建新的结点插入链接表Node *node = new Node;node->adjvex = end - 1;node->weight = weight;++G[end-1].inDegree; //入度加1//插入链接表的第一个位置node->next = G[begin-1].link;G[begin-1].link = node;}}}void printGraph(HeadNode *G, int nodeNum) {for (int i = 0; i < nodeNum; i++) {cout << "结点v" << G[i].nodeName << "的入度为";cout << G[i].inDegree << ", 以它为起始顶点的边为: ";Node *node = G[i].link;while (node != NULL) {cout << "v" << G[node->adjvex].nodeName << "(权:" << node->weight << ")" << " ";node = node->next;}cout << endl;}}//得到begin->end权重int getWeight(HeadNode *G, int begin, int end) {Node *node = G[begin-1].link;while (node) {if (node->adjvex == end - 1) {return node->weight;}node = node->next;}}//从start开始,计算其到每一个顶点的最短路径void Dijkstra(HeadNode *G, int nodeNum, int start) {//初始化所有结点for (int i = 0; i < nodeNum; i++) {G[i].d = INT_MAX; //到每一个顶点的距离初始化为无穷大G[i].isKnown = false; // 到每一个顶点的距离为未知数}G[start-1].d = 0; //到其本身的距离为0G[start-1].parent = -1; //表示该结点是起始结点while(true) {//==== 如果所有的结点的最短距离都已知, 那么就跳出循环int k;bool ok = true; //表示是否全部okfor (k = 0; k < nodeNum; k++) {//只要有一个顶点的最短路径未知,ok就设置为falseif (!G[k].isKnown) {ok = false;break;}}if (ok) return;//==========================================//==== 搜索未知结点中d最小的,将其变为known//==== 这里其实可以用最小堆来实现int i;int minIndex = -1;for (i = 0; i < nodeNum; i++) {if (!G[i].isKnown) {if (minIndex == -1)minIndex = i;else if (G[minIndex].d > G[i].d)minIndex = i;}}//===========================================cout << "当前选中的结点为: v" << (minIndex+1) << endl;G[minIndex].isKnown = true; //将其加入最短路径已知的顶点集// 将以minIndex为起始顶点的所有的d更新Node *node = G[minIndex].link;while (node != NULL) {int begin = minIndex + 1;int end = node->adjvex + 1;int weight = getWeight(G, begin, end);if (G[minIndex].d + weight < G[end-1].d) {G[end-1].d = G[minIndex].d + weight;G[end-1].parent = minIndex; //记录最短路径的上一个结点}node = node->next;}}}//打印到end-1的最短路径void printPath(HeadNode *G, int end) {if (G[end-1].parent == -1) {cout << "v" << end;fout << "v" << end;} else if (end != 0) {printPath(G, G[end-1].parent + 1); // 因为这里的parent表示的是下标,从0开始,所以要加1cout << " -> v" << end;fout << " -> v" << end;}}int main() {HeadNode *G;int nodeNum, arcNum;nodeNum=6;arcNum=36;G = new HeadNode[nodeNum];createGraph(G, nodeNum, arcNum);cout << "=============================" << endl;cout << "下面开始打印图信息..." << endl;printGraph(G, nodeNum);cout << "=============================" << endl;cout << "下面开始运行dijkstra算法..." << endl;for (int i=1;i<=6;i++){Dijkstra(G, nodeNum, i);cout << "=============================" << endl;cout << "打印从v"<<i<<"开始所有的最短路径" << endl;fout << "打印从v"<<i<<"开始所有的最短路径" << endl;for (int k = 1; k <= nodeNum; k++) {if(k!=i){if(G[k-1].d>=150){cout<<"v"<<i<<"到v" << k << "无法到达!";fout<<"v"<<i<<"到v" << k << "无法到达!";}else{cout << "v"<<i<<"到v" << k << "的最短路径为" << G[k-1].d << ": "; fout << "v"<<i<<"到v" << k << "的最短路径为" << G[k-1].d << ": "; printPath(G, k);}cout << endl;fout << endl;}}}}算法分析:图中应用Dijkstra算法更好地实现最短路问题,效率提高很多。
算法分析与设计实验报告 CQUPT
算法分析与设计实验报告 CQUPT计算机科学与技术学院算法分析与设计实验报告目录实验报告一排序问题求解 ........................................................................... .......................................... 2 实验报告二背包问题求解 ........................................................................... .......................................... 8 实验报告三最短路径求解 ........................................................................... ........................................ 12 实验报告四 N-皇后问题求解 ........................................................................... (18)姓名:XXX学号:XXXXXXXX班级:XXXXXXX实验报告一排序问题求解实验目的1)以排序(分类)问题为例,掌握分治法的基本设计策略。
2)熟练掌握一般插入排序算法的实现; 3)熟练掌握快速排序算法的实现; 4) 理解常见的算法经验分析方法;实验内容与步骤 1. 生成实验数据.要求:编写一个函数datagenetare,生成2000个在区间[1,10000]上的随机整数,并将这些数输出到外部文件data.txt中。
这些数作为后面算法的实验数据。
2. 实现直接插入排序算法. 要求:实现insertionsort算法。
算法的输入是data.txt;输出记录为文件:resultsIS.txt;同时记录运行时间为TimeIS。
重邮,王利,c语言实验课
C语言程序设计实验报告学号:姓名:班级:0801406任课教师:王利学期:2014-2015(2)第一次实验日志实验题目:1.改正错误,并让程序正确运行#include<stdio.h>void main(){printf(“these values are:\n”);int x=y=2.5;printf(“x=%d\n”,x);printf(“x=%d\n”,y);pri ntf(“x=%d\n”,z);}2.在屏幕上输出如下图形:*********3.已知三角形的底和高,求三角形的面积。
实验目的:掌握C程序的建立,和使用。
实验要求:独立完成实验题目实验主要步骤:1.打开C++;2.建立工作区和文件;3.根据题目要求,完成作业。
实验结果:#include <stdio.h>void main(){float x,y,z;x=y=z=2.5;printf("x=%f\n",x);printf("y=%f\n",y);printf("z=%f\n",z);printf("these values are:\n");printf(" *\n ***\n*****\n");float a,b,s;scanf("%f,%f",&a,&b);s=1/2*a*b;printf("三角形的面积:%f\n",(float)s);}心得体会:注意变量的精度问题,高精度不能赋值给低精度,可以通过(float)+变量名的方式改变变量精度。
第二次实验日志实验题目:1)某航空公司规定:在旅游旺季7~9月份,如果订票20张及其以上,优惠票价的10%;20张以下,优惠5%;在旅游淡季1~6月份、10~12月份,订票20张及其以上,优惠20%,20张以下,优惠10%。
数据结构实验报告(重邮)5个
数据结构实验报告学院:班级:姓名:学号:实验一线性链表的实现与操作题目:设计一个100位以内的长整数加减运算的程序班级:姓名:学号:完成日期:一、需求分析1、本实验中,100位长整数的每位上的数字必须为数字[0——9]之间,长整数的位数并要求100位以内。
测试的时候输入数据,当输入回车键的时候结束输入,如果输入的字符不符合题目要求,则程序能过滤这些不符合要求的字符。
2、演示程序以用户和计算机的对话方式执行,即在计算机显示“提示信息”后之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据(滤去输入中不符合要求的字符)和运算结果显示在其后。
3、程序执行的命令包括:(1)创建第一个整数(100以内);(2)执行加法或者减法;(3)创建第二个整数(100以内);(4)结束。
二、概要设计为实现上述程序功能,可以用链表或者长数组表示长整数,如果用数组表示长整数有个缺点就是长整数不能无限长,而链表能动态开辟空间,它克服了这个缺点,所以次试验用链表来表示长整数。
1、链表的抽象数据类型定义为:ADT Number{数据对象:D={a i| a i∈(0,1,…,9),i=0,1,2,…,n,n≥0}数据关系:R={< a i-1, a i>| a i-1, a i∈D,i=1,2,…,n}基本操作:CreateList(&L)操作结果:创建一个链表L。
PrintList(L)初始条件:链表L已存在。
操作结果:在屏幕上输出链表的值。
PlusList(L1,L2,a)初始条件:链表L1,L2已存在,a为+ or –表示加减。
操作结果:将两链表的值相加然后在屏幕上输出。
DestroyList(&L)初始条件:链表L已存在。
操作结果:销毁链表L。
} ADT Number2、本程序包含五个模块:int main(){定义变量;接受命令;处理命令;return 0;}各模块之间的调用关系如下:+or - :+or -三、详细设计1、定义头文件#include<stdio.h>#include<stdlib.h>#define LEN sizeof(Number)typedef struct number Number;struct number{int data;Number *next;Number *prior;};/////////////////////////////////////////////////////////////////////////////////////////////// ////////void main(){void DestoryList(Number *); //释放链表void PutNumber(Number *); //将求得的结果输出Number *GetNumber(); //创建链表,放被加数与加数Number *JiaFa(Number *num_1,Number *num_2);//加法函数Number *JianFa(Number *num_1,Number *num_2);//减法函数Number *number_1,*number_2,*number;char ch; //存放运算符号printf("Enter the first long number:");number_1=GetNumber();printf("put +or-:");ch=getchar();fflush(stdin); //吸收不相关的字符printf("Enter the second long number:");number_2=GetNumber();if(ch=='+')number=JiaFa(number_1,number_2);elseif(ch=='-')number=JianFa(number_1,number_2);printf("\n=\n");PutNumber(number);DestoryList(number);DestoryList(number_1);DestoryList(number_2);printf("链表释放完成。
算法设计算法实验报告(3篇)
第1篇一、实验目的本次实验旨在通过实际操作,加深对算法设计方法、基本思想、基本步骤和基本方法的理解与掌握。
通过具体问题的解决,提高利用课堂所学知识解决实际问题的能力,并培养综合应用所学知识解决复杂问题的能力。
二、实验内容1. 实验一:排序算法分析- 实验内容:分析比较冒泡排序、选择排序、插入排序、快速排序、归并排序等基本排序算法的效率。
- 实验步骤:1. 编写各排序算法的C++实现。
2. 使用随机生成的不同规模的数据集进行测试。
3. 记录并比较各算法的运行时间。
4. 分析不同排序算法的时间复杂度和空间复杂度。
2. 实验二:背包问题- 实验内容:使用贪心算法、回溯法、分支限界法解决0-1背包问题。
- 实验步骤:1. 编写贪心算法、回溯法和分支限界法的C++实现。
2. 使用标准测试数据集进行测试。
3. 对比分析三种算法的执行时间和求解质量。
3. 实验三:矩阵链乘问题- 实验内容:使用动态规划算法解决矩阵链乘问题。
- 实验步骤:1. 编写动态规划算法的C++实现。
2. 使用不同规模的矩阵链乘实例进行测试。
3. 分析算法的时间复杂度和空间复杂度。
4. 实验四:旅行商问题- 实验内容:使用遗传算法解决旅行商问题。
- 实验步骤:1. 设计遗传算法的参数,如种群大小、交叉率、变异率等。
2. 编写遗传算法的C++实现。
3. 使用标准测试数据集进行测试。
4. 分析算法的收敛速度和求解质量。
三、实验结果与分析1. 排序算法分析- 通过实验,我们验证了快速排序在平均情况下具有最佳的性能,其时间复杂度为O(nlogn),优于其他排序算法。
- 冒泡排序、选择排序和插入排序在数据规模较大时效率较低,不适合实际应用。
2. 背包问题- 贪心算法虽然简单,但在某些情况下无法得到最优解。
- 回溯法能够找到最优解,但计算量较大,时间复杂度较高。
- 分支限界法结合了贪心算法和回溯法的特点,能够在保证解质量的同时,降低计算量。
3. 矩阵链乘问题- 动态规划算法能够有效解决矩阵链乘问题,时间复杂度为O(n^3),空间复杂度为O(n^2)。
重庆邮电大学软件专业技术基础实验报告(耿道渠)
《软件技术基础》实验报告实验名称:顺序表的操作班级学号姓名第9 周星期 2 、5,6 节成绩一、实验目的:1、掌握顺序表结构的实现方式;2、掌握顺序表常用算法的实现;3、熟悉利用顺序表解决问题的一般思路;4、参照给定的顺序表的程序样例,验证给出的顺序表的常见算法,领会顺序表结构的优点和不足。
二、实验内容:1、设计一个静态数组存储结构的顺序表,要求编程实现如下任务:(1)建立一个顺序表,首先依次输人整数数据元素(个数根据需要键盘给定)。
(2)删除指定位置的数据元素(指定元素位置通过键盘输入),再依次显示删除后的顺序表中的数据元素。
(3)查找指定数据的数据元素(指定数据由键盘输入),若找到则显示位置,若没有找到则显示0。
2、使用顺序表实现一个电话本的管理程序,电话本中的每条记录包括学号、姓名、手机号码和固定电话四项。
要求实现菜单、初始化、添加、删除和显示等功能。
三、实验结果:四、实验中遇到的问题及解决方法:第一次编写C++,感觉力不从心,回去多看看PPT。
五、实验心得体会:对顺序表的一些常用语句不熟悉,对顺序表的整体思路理解不深刻以后要加强练习附:源程序(自行编写或修改的程序。
若为修改程序请注明修改部分的功能,若为书上实例则可不附。
)#include <iostream>#include <string>#include <stdlib.h>#include <iomanip>#define MAXSIZE 20using namespace std;int num;typedef struct{string student_number;string name;string tel;string home_phone;int id;} TEL;void shuaxin(TEL *);void delet(TEL *);void find(TEL *);void show(TEL *);int main(void){int choose;TEL List[MAXSIZE];while(1){cout << "***************************欢迎来到XXX电话本系统*********************" << endl;cout << "1.初始化并建立" <<endl;cout << "2.删除" <<endl;cout << "3.查找" <<endl;cout << "4.显示全部" << endl <<endl;cin >> choose;system("cls");while( choose < 1 || choose > 4){cout << "输入错误,数字1-4,请重新输入!" << endl;cin >> choose;system("cls");}switch(choose){case 1: shuaxin(List); break;case 2: delet(List); break;case 3: find(List); break;case 4: show(List); break;}//system("cls");}return 0;}void shuaxin(TEL * list){int i,j;for(i = 0; i < MAXSIZE; i++){list[i].id = i + 1;list[i].home_phone = "none";list[i].name = "none";list[i].student_number = "none";list[i].tel = "none";system("cls");cout << "初始化成功,现在开始建表:" << endl;cout << "请输入需要建立的电话个数:(小于" << MAXSIZE << ")"<<endl;cin >> num;while( num < 1 || num > MAXSIZE ){system("cls");cout << "输入错误,请重新输入" << endl;cin >> num;}system("cls");cout << "请依次输入学生的学号,姓名,移动电话,家庭电话" << endl;for(j = 1; j <= num; j++){cout << j << '.';cin >> list[j - 1].student_number;cin >> list[j - 1].name;cin >> list[j - 1].tel;cin >> list[j - 1].home_phone;cout << endl;if(num == (j - 1) ){system("cls");cout << "建立表完毕!" << endl;}}void delet(TEL * list){int j,i = 0;cout << "请输入你需要删除的序号" << endl;cin >> j;while( j < 0 || j > num){cout << "输入错误,请重新输入" << endl;cin >> j;}while(list[i].id != j)i++;for(j = i; j < num - 1; j++){list[j].name = list[j + 1].name;list[j].tel = list[j + 1].tel;list[j].student_number = list[j + 1].student_number;list[j].home_phone = list[j + 1].home_phone;}list[j].home_phone = "none";list[j].name = "none";list[j].student_number = "none";list[j].tel = "none";num--;system("cls");cout << "删除完毕" << endl;}void find(TEL * list){string telnum;int i,key = 0;cout << "请输入你需要查找的电话号码" << endl;cin >> telnum;system("cls");for(i = 0; i < MAXSIZE; i++){if(telnum == list[i].tel || telnum == list[i].home_phone){if(key == 0)cout << "依次学号姓名移动电话家庭电话" << endl;cout << list[i].id << '.';cout << setw(12) << list[i].student_number;cout << setw(10) << list[i].name;cout << setw(14) << list[i].tel;cout << setw(10) << list[i].home_phone;cout << endl;key = 1;}}if( key == 0)cout << "未找到此电话号码" << endl;}void show(TEL * list){int i;cout << "现在有" << num << "个电话号码" << endl;cout << "依次学号姓名移动电话家庭电话" << endl;for(i = 0; i < num; i++){cout << list[i].id << '.';cout << setw(12) << list[i].student_number;cout << setw(10) << list[i].name;cout << setw(14) << list[i].tel;cout << setw(10) << list[i].home_phone;cout << endl;}cout << "输出完毕" << endl;}《软件技术基础》实验报告实验名称:链表的操作(一)班级学号姓名第10 周星期 2 、5,6 节成绩一、实验目的:1、掌握单链表结构的实现方式;2、掌握单链表常用算法的实现。
基于PCF的BOC信号无模糊算法分析
问题 , 而 且 其 自相 关 函 数 相 对 于 B P S K( B i n a r y
f u n c t i o n ) 的方 法将 本 地 B O C信 号 进 行 时 分 调 制 得 到 多路 的类 B O C信号 与接 收信 号相 关 , 将 多路相 关 结果 进行 组合得 到无 副峰 的 相关 函数 , 并 且适 用 于 s i n B O C、 c o s B O C和 M B O C。该 算法 采 用乘 法 的组 合
第1 3卷
第2 8期
2 0 1 3年 1 0月
科
学
技
术
与
工
程
Vo1 .1 3 No . 28 Oc t .2 01 3
l 6 7 1 — 1 8 1 5 ( 2 01 3 ) 2 8 — 8 2 8 0 — 0 5
S c i e nc e Te c h n o l o g y a nd Eng i n e e r i ng
于P C F( P s e u d o C o r r e l a t i o n F u n c t i o n )算法 的同步算法。该算法首先将本地伪码和本地副载波调制到本地产 生的辅助信号 , 再
将 本 地 调 制 后 的 信 号 与处 理 后 的接 收信 号 进 行 相 关 处理 , 最 后 将 相 关 结 果 进 行 一定 形 式 的 运 算 得 到 只 有 一 个 单 峰 的相 关 函
《算法设计与分析》- 课内上机实验题目及其解答
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 ] ),
重庆邮电大学操作系统实验实验一
课程名称操作系统课程编号A2130330实验地点综合实验楼A511/A512 实验时间2019-04-29校外指导教师校内指导教师常光辉实验名称实验一进程控制描述与控制评阅人签字成绩一、实验目的实验1.1 Windows“任务管理器”的进程管理通过在Windows任务管理器中对程序进程进行响应的管理操作,熟悉操作系统进程管理的概念,学习观察操作系统运行的动态性能。
实验1.2 Windows Server 2016进程的“一生”1)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows Server 2016进程的“一生”;2)通过阅读和分析实验程序,学习创建进程、观察进程和终止进程的程序设计方法。
二、工具/准备工作1. 回顾教材相关内容;2. 在VMware WorkStation Pro中安装Windows Server 2016,如图1-1到图1-4;图1-1 新建虚拟机图1-2 Windows Server 2016安装程序图1-3 Windows Server 2016安装过程图1-4 Windows Server 2016安装完成3. 并在系统中安装Visual Studio 2019或Visual C++ 6.0或其他C++编译软件。
三、实验环境操作系统:Windows Server 2016(虚拟机)编程语言:C++集成开发环境:Visual Studio 2019四、实验步骤与实验过程实验1.1 Windows“任务管理器”的进程管理启动并进入Windows环境,单击Ctrl + Alt + Del键1,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口2。
图1-5 任务管理器在本次实验中,使用的操作系统版本是: Windows Server 2016当前机器中由你打开,正在运行的应用程序有:1)Task Manager (任务管理器,即当前应用)2)记事本(打开了测试文件new.txt,如图1-6所示)图1-6 记事本Windows“任务管理器”的窗口由 5 个选项卡组成,分别是:1)进程2)性能3)用户4)详细信息5)服务当前“进程”选项卡显示的栏目分别是(可移动窗口下方的游标/箭头,或使窗口最大化进行观察):1)应用2)后台进程3)Windows进程1. 使用任务管理器终止进程步骤1:单击“进程”选项卡,一共显示了 45 个进程。
算法设计与分析实验报告三篇
算法设计与分析实验报告一实验名称统计数字问题评分实验日期2014 年11 月15 日指导教师姓名专业班级学号一.实验要求1、掌握算法的计算复杂性概念。
2、掌握算法渐近复杂性的数学表述。
3、掌握用C++语言描述算法的方法。
4.实现具体的编程与上机实验,验证算法的时间复杂性函数。
二.实验内容统计数字问题1、问题描述一本书的页码从自然数1 开始顺序编码直到自然数n。
书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。
例如,第6 页用数字6 表示,而不是06 或006 等。
数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2, (9)2、编程任务给定表示书的总页码的10 进制整数n (1≤n≤109) 。
编程计算书的全部页码中分别用到多少次数字0,1,2, (9)三.程序算法将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。
把这些结果统计起来即可。
四.程序代码#include<iostream.h>int s[10]; //记录0~9出现的次数int a[10]; //a[i]记录n位数的规律void sum(int n,int l,int m){ if(m==1){int zero=1;for(int i=0;i<=l;i++) //去除前缀0{ s[0]-=zero;zero*=10;} }if(n<10){for(int i=0;i<=n;i++){ s[i]+=1; }return;}//位数为1位时,出现次数加1//位数大于1时的出现次数for(int t=1;t<=l;t++)//计算规律f(n)=n*10^(n-1){m=1;int i;for(i=1;i<t;i++)m=m*10;a[t]=t*m;}int zero=1;for(int i=0;i<l;i++){ zero*= 10;} //求出输入数为10的n次方int yushu=n%zero; //求出最高位以后的数int zuigao=n/zero; //求出最高位zuigaofor(i=0;i<zuigao;i++){ s[i]+=zero;} //求出0~zuigao-1位的数的出现次数for(i=0;i<10;i++){ s[i]+=zuigao*a[l];} //求出与余数位数相同的0~zuigao-1位中0~9出现的次数//如果余数是0,则程序可结束,不为0则补上所缺的0数,和最高位对应所缺的数if(yushu==0) //补上所缺的0数,并且最高位加1{ s[zuigao]++;s[0]+=l; }else{ i=0;while((zero/=10)>yushu){ i++; }s[0]+=i*(yushu+1);//补回因作模操作丢失的0s[zuigao]+=(yushu+1);//补回最高位丢失的数目sum(yushu,l-i-1,m+1);//处理余位数}}void main(){ int i,m,n,N,l;cout<<"输入数字要查询的数字:";cin>>N;cout<<'\n';n = N;for(i=0;n>=10;i++){ n/=10; } //求出N的位数n-1l=i;sum(N,l,1);for(i=0; i<10;i++){ cout<< "数字"<<i<<"出现了:"<<s[i]<<"次"<<'\n'; }} 五.程序调试中的问题调试过程,页码出现报错。
重庆邮电大学计算机网络实验报告
实验一网络命令与使用实验要求:1、在窗口中显示网络适配器的物理地址、主机的IP地址、子网掩码以及默认网关2、向一台电脑无限制的发送数据包,此数据包大小为60000byte3、查看本地计算机或另一台计算机的ARP高速缓存中的当前内容4、从一台ftp服务器上下载一份文件实验过程:1、在窗口中显示网络适配器的物理地址、主机的IP地址、子网掩码以及默认网关在命令行输入:ipconfig 命令2、向一台电脑无限制的发送数据包,此数据包大小为60000byte在命令行格式:ping [-t] [-a] [-n count] [-l length] [-f] [-i ttl] [-v tos] [-r count] [-s count] [[-j computer-list] | [-k computer-list]] [-w timeout] destination-lis其中-t表示ping指定计算机直到中断,-l定义发送数据包的长度。
3、查看本地计算机或另一台计算机的ARP高速缓存中的当前内容命令行格式:ARP -a [inet_addr] [-N if_addr]4、从一台ftp服务器上下载一份文件命令行格式:ftp [-v] [-n] [-i] [-d] [-g] [-s:filename] [-a] [-w:windowsize][computer]实验心得:通过对网络的基本的命令练习,让我对计算机网络的一些信息和原理有了一些粗略的体会,这些基本命令是以后学习经常会用到的,所以很重要。
实验二网络服务器建立与使用实验内容(1)IIS Web服务器的配置进入Web站点创建向导设定Web站点说明设置Web站点IP地址设置网页所在目录设置Web站点起始页创建测试网页启动Web服务器,测试。
(2)Serv-U FTP服务器的配置安装Serv-U FTP服务器;创建用户,绑定发布目录;设定目录权限;测试。
配置好web服务器后,登陆IP后可以进入配置HTML网页中FTP配置结果:实验心得:本次实验让我学会了IIS的配置,和FTP的配置。
重庆邮电大学算法分析复习
定义:如果存在正常数c1 ,c2 和n0 ,对于所 有的n≥n0,有 c1|g(n)| ≤|f(n)| ≤ c2|g(n)| 则记作:f (n) ( g (n)) 表示:算法在最好和最坏情况下的计算时间 就一个常数因子范围内而言是相同的。
多项式时间算法:可用多项式(函数)对其计算时 间限界的算法。常见的多项式限界函数有: Ο(1) < Ο(logn) < Ο(n) < Ο(nlogn) < Ο(n2) < Ο(n3) 指数时间算法:计算时间用指数函数限界的算法, 常见的指数时间限界函数: Ο(2n) < Ο(n!) < Ο(nn) 说明:当n取值较大时,指数时间算法和多项式时 间算法在计算时间上非常悬殊。
按增长率由小至大的顺序排列下列各 复杂度函数: 2^100, (2/3)^n,(3/2)^n, n^n , 根号n, n! ,2^n ,lgn ,n^lgn, n^(3/2)
分 析 如 下 : 2^100 是 常 数 阶 ; (2/3)^n 和 (3/2)^n是指数阶,其中前者是随n的增大而减 小的; n^n是指数方阶; √n 是方根阶, n! 就 是n(n-1)(n-2)... 就相当于n次方阶;2^n 是指 数阶,lgn是对数阶 ,n^lgn是对数方阶, n^(3/2) 是3/2次方阶。根据以上分析按增长率由小至 大的顺序可排列如下: (2/3)^n < 2^100 < lgn < √n < n^(3/2) < n^lgn < (3/2)^n < 2^n < n! < n^n
算法的5条特性及含义
确定性:算法的每一种运算必须要有确切的定义,即 每一种运算应该执行何种动作必须是相当清楚的、无 二义性。 可行性:一个算法是可行的指的是算法中有待实现的 运算都是基本的运算,每种运算至少在原理上能由人 用纸和笔在有限的时间内完成。 输入:一个算法有0个或多个输入,这些输入是算法开 始之前给出的量,这些输入取自特定的对象集合。 输出:一个算法产生一个或多个输出,这些输出是同 输入有某种特定关系的量。 有穷性:一个算法总是在执行了有穷步的运算之后终 止。 凡是算法,都必须满足以上5条特性。只满足前4条特性 的一组规则不能称为算法,只能叫做计算过程。
重庆邮电大学计算机学院C++上机试验报告
C++集中上机实验日志实验6—1一、问题描述定义一个字符串类String,其数据成员有指向字符串的指针elems,成员函数包括构造函数、析构函数、判断字符串是否为空的operator!()。
编程测试类String的功能。
二、实验输出如图所示:三、实验思路以及方法判断字符串是否为空即是对字符串进行非运算,即重载operator!()。
逻辑非运算是单目运算符,按照运算符重载方针,应该重载为类的成员函数。
由于逻辑非运算结果只有两种:真、假,因此operator!()的返回值类型为bool型。
四心得体会开始没有判断elems的空指针问题,遇到一点麻烦,改过之后就ok了,本实验让我们学习了“运算符重载类的成员函数”,对以后的学习C++有了很大了帮助。
代码实现#include<iostream>#include<string>using namespace std;class String{public:String(const char *e=NULL);~String();bool operator!()const;private:char *elems;};String::String (const char *e){if(e==NULL){elems=NULL;return;}else{elems=new char[strlen(e)];strcpy(elems,e);return;}}bool String::operator !()const{if(elems==NULL)return true;else return false;}String::~String (){if(elems!=NULL)delete[]elems;}int main(){String str;if(!str)cout<<"这是一个空字符串!"<<endl;return 0;}实验6-3一、问题重述对于具有相同行列数的矩阵进行加、减、乘、转置、赋值运算。
重庆邮电大学 c语言实验报告
C语言上机实验报告教师:李盘林班级:0201102学号:2011210743姓名:郑振华实验1熟悉c语言编程环境实验日志指导教师李盘林实验时间2012 年3月13日学院光电工程专业电子工程类班级 0201102 学号 2011210743 姓名郑振华实验室 s311实验题目:1.在屏幕上显示一个短句“Hello Word!”。
2.在屏幕上显示一个图形。
3.改正错误程序,在屏幕上显示“Welcome to you!”。
4.改正错误程序,在屏幕上显示如下图形:***************Welcome***************实验目的:1.熟悉c程序设计编程环境创天中文版v c++,掌握运行一个c程序设计的基本步骤,包括编辑、编译、连接和运行。
2.掌握c语言程序设计的基本框架,能够编写简单的c程序。
3.理解程序调试的思想,能找出并改正c程序中的语法错误。
实验要求:了解和熟悉C语言程序开发的环境;学会上机调试程序,善于发现程序中的错误,并且能很快地排除这些错误,使程序能正确运行,达到实验知识和理论知识的融会贯通。
上机实验前,学生必须事先根据题目的内容编好程序,然后在实验时输入程序、调试程序、直至运行结果正确为止,上机结束后,应整理出实验报告。
实验主要步骤:1.在“我的电脑”上新建一个文件夹,用于存放c程序,文件夹名字可以是学号姓名。
2.调试示例,在屏幕上显示一个短句“Hello World!”。
源程序#include <stdio.h>void main(){prin tf(“Hello World!\n”);}运行结果:Hello World!基本步骤:(要求熟练掌握)1)启动VC++“开始”->“程序”->“Microsoft Visual Studio 6.0”->“Microsoft Visual C++6.0”进入VC++编程环境。
2)新建文件(*.cpp)“文件”->“新建”,单击“文件”选项卡,选择“C++Source Files”,修改文件保存“目录”和“文件”(文件名),单击“确定”。
重庆邮电大学自动化集中上机实验报告
成绩:实验名称:集中上级1——C语言程序设计学生姓名:学生学号:学生专业:学生班级:指导教师:实习时间:大一下第5、8、9、12周实验名称 C语言运行过程、简单的C程序设计一:实验目的1.了解VC软件的窗口界面,熟练掌握VC的菜单命令及相应的键命令,并在VC环境下掌握如何编辑、编译、连接、运行一个C程序过程滨如何保存和修改C语言的源程序。
2.通过运行一个简单的C程序过程,逐步了解C程序的基本结构及特点。
3.掌握C语言的基本数据类型,熟悉它们的使用方法及定义方式,了解几种类型数据输出是用的格式转换符(整型、字符型、实型),熟悉各种运算符和表达式的使用特点。
4.熟悉掌握C中赋值运算的使用。
二:实验内容5.使用VC6.运行简单的C程序三:实验结果第一题:输出三个数中的最大值#include<stdio.h>void main(){int a,b,c,max;printf("请输入三个数:");scanf("%d%d%d",&a,&b,&c);max=(a>b)?a:b;max=(max>c)?max:c;printf("max=%d\n",max);}第二题:输出四个数中的最大值#include <stdio.h>void main( ){int a,b,c,d,max1,max2,max;printf("请输入四个数:");scanf("%d%d%d%d",&a,&b,&c,&d);max1=(a>b)? a:b;max2=(c>d)? c:d;max=(max1>max2)? max1:max2;printf("max=%d\n",max);}四:问题讨论(实验心得和体会)通过运行一个简单的C程序过程,掌握Vc的界面以及功能,了解C程序基本结构及特点以及掌握简单的编程思路,实验名称数据类型、运算符和表达式一:实验目的1.掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量,以及对它们赋值的方法,了解以上类型数据输出时所用的格式转换符。
重庆邮电大学数据库实验报告
实验一PowerDesigner的CDM应用学号姓名一、实验内容用PowerDesigner设计概念数据模型。
二、遇到的问题及解决说实话第一次实验比较简单,而且实验指导书讲解得非常的详细,所以我按部就班地做一会儿就做出来了,有一点小问题就是在设置主键的时候勾选到F了,后来一想主键应该是Primary key才对,F应该是Foreign key,然后修改过来了。
三、心得体会用PowerDesigner设计概念模型非常的方便,这方便我们在以后将概念数据模型转换为屋里数据模型。
实验二PowerDesigner的PDM应用学号姓名一、实验内容将PowerDesigner的概念数据模型转换为物理数据模型。
/*==============================================================*//* DBMS name: MySQL 5.0 *//* Created on: 2014-3-18 19:57:37 *//*==============================================================*/drop table if exists Bookstore;drop table if exists address;drop table if exists buybook;drop table if exists customer;/*==============================================================*/ /* Table: Bookstore *//*==============================================================*/ create table Bookstore(storeId char(6) not null,storename varchar(30),Address varchar(60),city varchar(20),prevence varchar(20),code char(6),primary key (storeId));/*==============================================================*/ /* Table: address *//*==============================================================*/ create table address(AddressType char(2),CustomerID varchar(10),Address1 varchar(50),Address2 varchar(50),City varchar(20),State varchar(15),zipcode char(6) not null,primary key (zipcode));/*==============================================================*/ /* Table: buybook *//*==============================================================*/ create table buybook(CustomerID varchar(10) not null,storeId char(6),primary key (CustomerID));/*==============================================================*/ /* Table: customer *//*==============================================================*/ create table customer(CustomerID varchar(10) not null,AccountBalance decimal(10,2),FirstName varchar(10),LastName varchar(20),CompanyName varchar(40),primary key (CustomerID));alter table address add constraint FK_livein foreign key (CustomerID)references customer (CustomerID) on delete restrict on update restrict;alter table buybook add constraint FK_buybook foreign key (CustomerID)references customer (CustomerID) on delete restrict on update restrict;alter table buybook add constraint FK_buybook2 foreign key (storeId)references Bookstore (storeId) on delete restrict on update restrict;二遇到的问题及解决这次试验的难度有所提升,所以问题开始多了起来,总共遇到两个问题,1.在生成PDM的过程中会包两个错误,思考了很久,我看到错误提示是关于key(键)的,由于有一个关系没有设置主键,所以产生PDM的时候会报错,于是我把那个关系设置了一个主键问题就解决了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四贪心算法求解最短路径问题实验目的:1)以解决最短路径问题为例,掌握贪心算法的基本设计策略;2)掌握Dijkstra贪心法求解单源点最短路径问题并实现;3)分析实验结果。
实验环境计算机、C语言程序设计环境实验学时2学时实验内容与步骤1.准备实验数据假设算法要处理下图,需要把图数据组织存放到相应的数据结构中,如:权值矩阵float graph[maxsize][maxsize]。
2.实现Dijkstra算法代码:#include <iostream>#include <fstream>#include <string>using namespace std;const int N = 6;const int M = 1000;ifstream fin("e://4d5.txt");ofstream fout("e://dijkstra-output1.txt");template<class Type>void Dijkstra(int n,int v,Type dist[],int prev[],Type c[][N+1]);void Traceback(int v,int i,int prev[]);//输出最短路径v源点,i终点int main(){int v = 1;//源点为1int dist[N+1],prev[N+1],c[N+1][N+1];cout<<"有向图权的矩阵为:"<<endl;for(int i=1; i<=N; i++){for(int j=1; j<=N; j++){fin>>c[i][j];cout<<c[i][j]<<" ";}cout<<endl;}Dijkstra(N,v,dist,prev,c);for(int i1=2; i1<=N; i1++){fout<<"源点1到点"<<i1<<"的最短路径长度为:"<<dist[i1]<<",其路径为";cout<<"源点1到点"<<i1<<"的最短路径长度为:"<<dist[i1]<<",其路径为";Traceback(1,i1,prev);cout<<endl;fout<<endl;}return 0;}template<class Type>void Dijkstra(int n,int v,Type dist[],int prev[],Type c[][N+1]){bool s[N+1];for(int i=1; i<=n; i++){dist[i] = c[v][i];//dist[i]表示当前从源到顶点i的最短特殊路径长度s[i] = false;if(dist[i] == M){prev[i] = 0;//记录从源到顶点i的最短路径i的前一个顶点}else{prev[i] = v;}}dist[v] = 0;s[v] = true;for(int i1=1; i1<n; i1++){int temp = M;int u = v;//上一顶点//取出V-S中具有最短特殊路径长度的顶点ufor(int j=1; j<=n; j++){if((!s[j]) && (dist[j]<temp)){u = j ;temp = dist[j];}}s[u] = true;//根据作出的贪心选择更新Dist值for(int j1=1; j1<=n; j1++){if((!s[j1]) && (c[u][j1]<M)){Type newdist = dist[u] + c[u][j1];if(newdist < dist[j1]){dist[j1] = newdist;prev[j1] = u;}}}}}//输出最短路径v源点,i终点void Traceback(int v,int i,int prev[]){if(v == i){cout<<i;fout<<i;return;}Traceback(v,prev[i],prev);cout<<"->"<<i;fout<<"->"<<i;}结果:#include <iostream>#include <limits>#include <fstream>#include <string>using namespace std;ofstream fout("e://dijkstra-output2.txt");struct Node { //定义表结点int adjvex; //该边所指向的顶点的位置int weight;// 边的权值Node *next; //下一条边的指针};struct HeadNode{ // 定义头结点int nodeName; // 顶点信息int inDegree; // 入度int d; //表示当前情况下起始顶点至该顶点的最短路径,初始化为无穷大bool isKnown; //表示起始顶点至该顶点的最短路径是否已知,true表示已知,false表示未知int parent; //表示最短路径的上一个顶点Node *link; //指向第一条依附该顶点的边的指针};//G表示指向头结点数组的第一个结点的指针//nodeNum表示结点个数//arcNum表示边的个数void createGraph(HeadNode *G, int nodeNum, int arcNum) {cout << "开始创建图(" << nodeNum << ", " << arcNum << ")" << endl; //初始化头结点for (int i = 0; i < nodeNum; i++) {G[i].nodeName = i+1; //位置0上面存储的是结点v1,依次类推G[i].inDegree = 0; //入度为0G[i].link = NULL;}inta[6][6]={{0,999,15,999,999,999},{2,999,999,999,10,30},{999,4,0,999,99 9,10},{999,999,999,0,999,999},{999,999,999,15,0,999},{999,999,999,4,1 0,0}};for (int j = 0;j<6;j++) {for(int k=0;k<6;k++){int begin, end, weight;begin = j+1;end=k+1;weight= a[j][k];// 创建新的结点插入链接表Node *node = new Node;node->adjvex = end - 1;node->weight = weight;++G[end-1].inDegree; //入度加1//插入链接表的第一个位置node->next = G[begin-1].link;G[begin-1].link = node;}}}void printGraph(HeadNode *G, int nodeNum) {for (int i = 0; i < nodeNum; i++) {cout << "结点v" << G[i].nodeName << "的入度为";cout << G[i].inDegree << ", 以它为起始顶点的边为: ";Node *node = G[i].link;while (node != NULL) {cout << "v" << G[node->adjvex].nodeName << "(权:" << node->weight << ")" << " ";node = node->next;}cout << endl;}}//得到begin->end权重int getWeight(HeadNode *G, int begin, int end) {Node *node = G[begin-1].link;while (node) {if (node->adjvex == end - 1) {return node->weight;}node = node->next;}}//从start开始,计算其到每一个顶点的最短路径void Dijkstra(HeadNode *G, int nodeNum, int start) {//初始化所有结点for (int i = 0; i < nodeNum; i++) {G[i].d = INT_MAX; //到每一个顶点的距离初始化为无穷大G[i].isKnown = false; // 到每一个顶点的距离为未知数}G[start-1].d = 0; //到其本身的距离为0G[start-1].parent = -1; //表示该结点是起始结点while(true) {//==== 如果所有的结点的最短距离都已知, 那么就跳出循环int k;bool ok = true; //表示是否全部okfor (k = 0; k < nodeNum; k++) {//只要有一个顶点的最短路径未知,ok就设置为falseif (!G[k].isKnown) {ok = false;break;}}if (ok) return;//==========================================//==== 搜索未知结点中d最小的,将其变为known//==== 这里其实可以用最小堆来实现int i;int minIndex = -1;for (i = 0; i < nodeNum; i++) {if (!G[i].isKnown) {if (minIndex == -1)minIndex = i;else if (G[minIndex].d > G[i].d)minIndex = i;}}//===========================================cout << "当前选中的结点为: v" << (minIndex+1) << endl;G[minIndex].isKnown = true; //将其加入最短路径已知的顶点集// 将以minIndex为起始顶点的所有的d更新Node *node = G[minIndex].link;while (node != NULL) {int begin = minIndex + 1;int end = node->adjvex + 1;int weight = getWeight(G, begin, end);if (G[minIndex].d + weight < G[end-1].d) {G[end-1].d = G[minIndex].d + weight;G[end-1].parent = minIndex; //记录最短路径的上一个结点}node = node->next;}}}//打印到end-1的最短路径void printPath(HeadNode *G, int end) {if (G[end-1].parent == -1) {cout << "v" << end;fout << "v" << end;} else if (end != 0) {printPath(G, G[end-1].parent + 1); // 因为这里的parent表示的是下标,从0开始,所以要加1cout << " -> v" << end;fout << " -> v" << end;}}int main() {HeadNode *G;int nodeNum, arcNum;nodeNum=6;arcNum=36;G = new HeadNode[nodeNum];createGraph(G, nodeNum, arcNum);cout << "=============================" << endl;cout << "下面开始打印图信息..." << endl;printGraph(G, nodeNum);cout << "=============================" << endl;cout << "下面开始运行dijkstra算法..." << endl;for (int i=1;i<=6;i++){Dijkstra(G, nodeNum, i);cout << "=============================" << endl;cout << "打印从v"<<i<<"开始所有的最短路径" << endl;fout << "打印从v"<<i<<"开始所有的最短路径" << endl;for (int k = 1; k <= nodeNum; k++) {if(k!=i){if(G[k-1].d>=150){cout<<"v"<<i<<"到v" << k << "无法到达!";fout<<"v"<<i<<"到v" << k << "无法到达!";}else{cout << "v"<<i<<"到v" << k << "的最短路径为" << G[k-1].d << ": "; fout << "v"<<i<<"到v" << k << "的最短路径为" << G[k-1].d << ": "; printPath(G, k);}cout << endl;fout << endl;}}}}算法分析:图中应用Dijkstra算法更好地实现最短路问题,效率提高很多。