1、第i个结点与其他结点如果相连则为1,无连接则为0,数据之间用空格隔开(完成)以此类推输入下一个示例(完成)Output每行输出一个图的深度优先搜索结果,结点编号之间用空格隔开(完成)Problem B: DS图遍历-广度优先搜索以此类推输入下一个示例每行输出一个图的广度优先搜索结果,结点编号之间用空格隔开(完成)Contest1638 - DS实验09-最短路径【11.19】 DS图应用-最短路径给出一个图的邻接矩阵,再给出指定顶点v0,求顶点v0到其他顶点的最短路径(完成)第i个结点与其他结点如果相连则为1,无连接则为0,数据之间用空格隔开第四行输入v0,表示求v0到其他顶点的最短路径距离(
2、完成)每行输出v0到某个顶点的最短距离和最短路径(完成)每行格式:v0编号-其他顶点编号-最短路径,具体请参考示范数据(完成)二、主要思路与方法:1. 对于本次实验,说明你认为最重要的函数、算法或知识点,并谈谈你对它们的理解从0开始连续获取邻接结点,然后逐个遍历并设Visit为true避免重复遍历首先将该顶点的邻接顶点全部入队,然后挨个读取,在读取的过程中继续将邻接矩阵入队,并把已经读取过的顶点全被设为true。 输入mx矩阵Mx12345715初始化并赋值Matrix的矩阵Matrix初始化并赋值path的矩阵Path-1初始化并赋值dist数组Dist初始并赋值len数组Len i=1的时
3、候;min=9999;v=1;min=5;final1=true;可以访问。Dist2=5+ Matrix12=10;2=1;Path数组改变Dist数组改变10v=3;min=7;final3=true;Dist2=7+ Matrix32=9;2=3;9v=2;min=9;final2=true;Dist4=9+Matrix24=10;4=2;6三实验程序或内容:1. 针对每一项实验要求,给出编写的代码,2. 可以粘贴全部代码,或者可以只粘贴重要的代码(为了节省纸张),但代码必须完整,至少是完整的函数。3. 代码符合以下要求,评分更高:a. 排版整齐,可读性高b. 代码有注释,越详细越清晰越
4、好#includeusing namespace std;const int MaxLen=20;class Map private: bool VisitMaxLen; int MatrixMaxLenMaxLen; int Vexnum; void DFS(int v);public: void SetMatrix(int vnum,int mxMaxLenMaxLen); void DFSTraverse();/设置邻接矩阵 void Map:SetMatrix(int vnum,int mxMaxLenMaxLen) int i,j; Vexnum=vnum; for(i=-1;+iM
5、axLen;) for(j=-1;+j Matrixij=0;Vexnum; Matrixij=mxij; DFSTraverse() int v; /将所有的Visit赋值为false for(v=-1;+v Visitv=false; /开始逐个遍历未访问结点 if(!Visitv) DFS(v); /if /for coutendl;DFS(int v) int w,i,k; Visitv=true; /输出访问的结点vt; while(t-) n; int mx2020;mxij; m.SetMatrix(n,mx); m.DFSTraverse(); return 0;queue v
6、oid BFSTraverse(); void BFS(int v);BFSTraverse() BFS(0);BFS(int v) int w,u; int i,k; queueQ; Visiti=false; Q.push(v); while(!Q.empty() u=Q.front(); Q.pop(); if(Matrixui) Visitw=true;w Q.push(w); /for /while m.BFSTraverse();const int MaxDist=9999; void ShortestPath_DIJ(int v0);SetMatrix(int vnum,int
7、mxMaxLenMaxLen) /给矩阵赋值 /定点数量赋值 /先给所有的矩阵初始化为9999) Matrixij=MaxDist; /把mx矩阵的内容赋给Matrix if(mxij) ShortestPath_DIJ(int v0) int i,j,v,w,min; int *dist=new intVexnum; bool *final=new boolVexnum; int pathMaxLenMaxLen; int lenMaxLen; /给final初始化为false,将Matrix指定行的值赋给dist /path数组全部赋值为-1) finali=false; disti=Ma
8、trixv0i; pathij=-1; /如果dist中的值小于9999的话 /path指定列赋值为v0 /path的左上右下对角线赋值为v /指定顶点的长度赋值为Vexnum /path的作用是一个顶点有一行,这一行里从左到右表示依次到达的结点 /例如第二行下标为1 /0 2 3 1表示从0到2到3到1 /若为最终结果即为从0到1的所有路径中的最短路径 /0行则没必要标出了。 /path的赋值是从列开始的 /这个时候dist0=9999 if(distvMaxDist) pathvv0=v0; pathvv=v; lenv=Vexnum; /dist指定位置的值赋值为0 /v0设置为已经访问
9、 distv0=0; finalv0=true; /最小值等于9999 /判断是否未访问 /若未访问,如果distw小于最小值,就记录w和distw,分别赋给v和min /v位置为最小值的位置,设定为true /如果finalw未访问且最小值加上矩阵vw位置的值仍然小于distw /distw取值min+Matrixvw /然后领把v行的path值赋给w行 /在w行末尾加个w /w行的长度等于v行加1 for(i=0;) /跳过0 /找到dist中的未被标记为true的最小值,然后标记为true,然后遍历邻接结点 min=MaxDist; for(w=-1;+w if(!finalw) if(
10、distwmin)v=w;min=distw;/if finalv=true;) /min+Matrixvwdistw有这个判断的原因是 /比如我想从A点到B点,它的权值为30 /但是我从A点先到C点,再到B点,它的权值和为25 /那这样的话明显是先经过C点再到B点这个路径更好 /!finalw是遍历其余的为遍历过的结点,避免与上一个已访问过的结点遍历finalw&(min+Matrixvwdistw) distw=min+Matrixvw;lenv; /赋值的原因是从这个路径pathv(0-XXX-v)再到(w)能获得更短的路径 pathwj=pathvj; /在行尾加上当前结点,即从(0-
11、XXX-v-w) pathwj=w; lenw=lenv+1; /if /输出 if(i!=v0) v0-idisti- if(pathij!=-1) pathij deletedist; deletefinal; int i,j,k,t; int vnum,v0; int mxMaxLenMaxLen; Map myMap; for(k=0;kk+) i+) for(j=0;jj+) mxij=0;vnum; myMap.SetMatrix(vnum,mx);v0; myMap.ShortestPath_DIJ(v0);四、实验结论:1、根据你完成的每个实验要求,给出相应的实验结果图,并结合图来解析运行过程2、如果运行过程简单,只要贴出VC运行的结果图。3、如果无结果图,有网站的判定结果,贴出相应结果Sample Input0 0 1 11 1 0 11 1 1 00 0 0 1 10 0 1 0 00 1 0 1 11 0 1 0 0Sample Output0 2 1 3 0 3 2 1 4 Pr
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1