图结构试验实验报告Word下载.docx
《图结构试验实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《图结构试验实验报告Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
![图结构试验实验报告Word下载.docx](https://file1.bdocx.com/fileroot1/2022-11/23/ac547fc6-badc-4fec-b745-9683513c52f0/ac547fc6-badc-4fec-b745-9683513c52f01.gif)
第i个结点与其他结点如果相连则为1,无连接则为0,数据之间用空格隔开(完成)
以此类推输入下一个示例(完成)
Output
每行输出一个图的深度优先搜索结果,结点编号之间用空格隔开(完成)
ProblemB:
DS图遍历--广度优先搜索
以此类推输入下一个示例
每行输出一个图的广度优先搜索结果,结点编号之间用空格隔开(完成)
Contest1638-DS实验09--最短路径【11.19】
DS图应用--最短路径
给出一个图的邻接矩阵,再给出指定顶点v0,求顶点v0到其他顶点的最短路径(完成)
第i个结点与其他结点如果相连则为1,无连接则为0,数据之间用空格隔开
第四行输入v0,表示求v0到其他顶点的最短路径距离(完成)
每行输出v0到某个顶点的最短距离和最短路径(完成)
每行格式:
v0编号-其他顶点编号----[最短路径],具体请参考示范数据(完成)
二、主要思路与方法:
1.对于本次实验,说明你认为最重要的函数、算法或知识点,并谈谈你对它们的理解
从0开始连续获取邻接结点,然后逐个遍历并设Visit为true避免重复遍历
首先将该顶点的邻接顶点全部入队,然后挨个读取,在读取的过程中继续将邻接矩阵入队,并把已经读取过的顶点全被设为true。
①输入mx矩阵
Mx
1
2
3
4
5
7
15
②初始化并赋值Matrix的矩阵
Matrix
∞
③初始化并赋值path的矩阵
Path
-1
④初始化并赋值dist数组
Dist
⑤初始并赋值len数组
Len
⑥i=1的时候;
min=9999;
v=1;
min=5;
final[1]=true;
可以访问。
Dist[2]=5+Matrix[1][2]=10;
[2]=[1];
Path数组改变
Dist数组改变
10
⑦v=3;
min=7;
final[3]=true;
Dist[2]=7+Matrix[3][2]=9;
[2]=[3];
9
⑧v=2;
min=9;
final[2]=true;
Dist[4]=9+Matrix[2][4]=10;
[4]=[2];
6
三.实验程序或内容:
1.针对每一项实验要求,给出编写的代码,
2.可以粘贴全部代码,或者可以只粘贴重要的代码(为了节省纸张),但代码必须完整,至少是完整的函数。
3.代码符合以下要求,评分更高:
a.排版整齐,可读性高
b.代码有注释,越详细越清晰越好
#include<
iostream>
usingnamespacestd;
constintMaxLen=20;
classMap{
private:
boolVisit[MaxLen];
intMatrix[MaxLen][MaxLen];
intVexnum;
voidDFS(intv);
public:
voidSetMatrix(intvnum,intmx[MaxLen][MaxLen]);
voidDFSTraverse();
};
//设置邻接矩阵
voidMap:
:
SetMatrix(intvnum,intmx[MaxLen][MaxLen])
{
inti,j;
Vexnum=vnum;
for(i=-1;
++i<
MaxLen;
)
for(j=-1;
++j<
Matrix[i][j]=0;
Vexnum;
Matrix[i][j]=mx[i][j];
}
DFSTraverse()
intv;
//将所有的Visit赋值为false
for(v=-1;
++v<
Visit[v]=false;
//开始逐个遍历未访问结点
{
if(!
Visit[v])
DFS(v);
}//if
}//for
cout<
<
endl;
DFS(intv)
intw,i,k;
Visit[v]=true;
//输出访问的结点
v<
"
"
;
//初始化AdjVex
int*AdjVex=newint[Vexnum];
AdjVex[i]=-1;
//开始遍历这个顶点能到达的邻接顶点
k=0;
if(Matrix[v][i])
//把这个顶点的邻接顶点赋值给AdjVex
AdjVex[k++]=i;
}//for
//开始逐个遍历邻接结点,此处用了递归,会把将要遍历的结点的Visit赋值为true
i=0;
for(;
w=AdjVex[i++],w!
=-1;
Visit[w])
DFS(w);
delete[]AdjVex;
intmain()
intt,n,i,j;
Mapm;
cin>
>
t;
while(t--)
n;
intmx[20][20];
mx[i][j];
m.SetMatrix(n,mx);
m.DFSTraverse();
}
return0;
}
queue>
voidBFSTraverse();
voidBFS(intv);
BFSTraverse()
BFS(0);
BFS(intv)
intw,u;
inti,k;
queue<
int>
Q;
Visit[i]=false;
Q.push(v);
while(!
Q.empty())
u=Q.front();
Q.pop();
if(Matrix[u][i])
Visit[w]=true;
w<
Q.push(w);
}//for
}//while
m.BFSTraverse();
constintMaxDist=9999;
voidShortestPath_DIJ(intv0);
SetMatrix(intvnum,intmx[MaxLen][MaxLen]){//给矩阵赋值
//定点数量赋值
//先给所有的矩阵初始化为9999
)
Matrix[i][j]=MaxDist;
//把mx矩阵的内容赋给Matrix
if(mx[i][j])
ShortestPath_DIJ(intv0)
inti,j,v,w,min;
int*dist=newint[Vexnum];
bool*final=newbool[Vexnum];
intpath[MaxLen][MaxLen];
intlen[MaxLen];
//给final初始化为false,将Matrix指定行的值赋给dist
//path数组全部赋值为-1
){
final[i]=false;
dist[i]=Matrix[v0][i];
path[i][j]=-1;
//如果dist中的值小于9999的话
//path指定列赋值为v0
//path的左上右下对角线赋值为v
//指定顶点的长度赋值为Vexnum
//path的作用是一个顶点有一行,这一行里从左到右表示依次到达的结点
//例如第二行下标为1
//0231表示从0到2到3到1
//若为最终结果即为从0到1的所有路径中的最短路径
//0行则没必要标出了。
//path的赋值是从列开始的
//这个时候dist[0]=9999
if(dist[v]<
MaxDist){
path[v][v0]=v0;
path[v][v]=v;
}
len[v]=Vexnum;
//dist指定位置的值赋值为0
//v0设置为已经访问
dist[v0]=0;
final[v0]=true;
//最小值等于9999
//判断是否未访问
//若未访问,如果dist[w]小于最小值,就记录w和dist[w],分别赋给v和min
//v位置为最小值的位置,设定为true
//如果final[w]未访问且最小值加上矩阵vw位置的值仍然小于dist[w]
//dist[w]取值min+Matrix[v][w]
//然后领把v行的path值赋给w行
//在w行末尾加个w
//w行的长度等于v行加1
for(i=0;
){//跳过0
//找到dist中的未被标记为true的最小值,然后标记为true,然后遍历邻接结点
min=MaxDist;
for(w=-1;
++w<
{if(!
final[w])
if(dist[w]<
min){v=w;
min=dist[w];
}//if
final[v]=true;
){
//min+Matrix[v][w]<
dist[w]有这个判断的原因是
//比如我想从A点到B点,它的权值为30
//但是我从A点先到C点,再到B点,它的权值和为25
//那这样的话明显是先经过C点再到B点这个路径更好
//!
final[w]是遍历其余的为遍历过的结点,避免与上一个已访问过的结点遍历
final[w]&
&
(min+Matrix[v][w]<
dist[w])){
dist[w]=min+Matrix[v][w];
len[v];
//赋值的原因是从这个路径path[v](0-XXX-v)再到(w)能获得更短的路径
path[w][j]=path[v][j];
//在行尾加上当前结点,即从(0-XXX-v-w)
path[w][j]=w;
len[w]=len[v]+1;
}//if
//输出
if(i!
=v0)
v0<
-"
i<
dist[i]<
---["
if(path[i][j]!
=-1)
path[i][j]<
]"
delete[]dist;
delete[]final;
inti,j,k,t;
intvnum,v0;
intmx[MaxLen][MaxLen];
MapmyMap;
for(k=0;
k<
k++){
i++)
for(j=0;
j<
j++)
mx[i][j]=0;
vnum;
myMap.SetMatrix(vnum,mx);
v0;
myMap.ShortestPath_DIJ(v0);
四、实验结论:
1、根据你完成的每个实验要求,给出相应的实验结果图,并结合图来解析运行过程
2、如果运行过程简单,只要贴出VC运行的结果图。
3、如果无结果图,有网站的判定结果,贴出相应结果
SampleInput
0011
1101
1110
00011
00100
01011
10100
SampleOutput
0213
03214
Pr