实验11图的最短路径实验报告1.docx
《实验11图的最短路径实验报告1.docx》由会员分享,可在线阅读,更多相关《实验11图的最短路径实验报告1.docx(12页珍藏版)》请在冰豆网上搜索。
实验11图的最短路径实验报告1
深圳大学实验报告
课程名称:
数据结构实验与课程设计
实验项目名称:
图的最短路径实验
学院:
计算机与软件学院
专业:
网络工程
指导教师:
杨芳
报告人:
李楚煌学号:
2013150383班级:
8
实验时间:
2014-11-6
实验报告提交时间:
2014-11-6
教务处制
一、实验目的
1、掌握图结构的(邻接矩阵)输入方法
2、掌握图结构的说明、创建以及图的存储表示(邻接矩阵)
3、掌握最短路径算法原理
4、掌握最短路径算法的编程实现方法
二、实验要求
1、熟悉C++语言编程
2、熟悉图的邻接矩阵存储表示
3、熟悉最短路径算法原理
4、熟练使用C++语言,实现最短路径算法
三、实验内容
本次实验有两项内容:
(一)图的最短路径实验
1、问题描述
给定一个顶点(始点),求该顶点(始点)到(连通)图中其它顶点的最短路径。
2、算法
⑴、初始化:
S←{v1};//始点送S
D[i]←arc[1][i],i=2,3,…,n;//从v1到vi的距离
P[i]={1,i}//从v1到vi的路径
⑵、求出最短路径的长度:
D[j]←min{D[i]},iV-S;S←SU{j};
⑶、修改:
if(D[i]>D[j]+arc[j][i]){
D[i]=D[j]+arc[j][i];
P[i]=P[j]U{i};}iV-S//更新从v1到vi的路径
⑷、判断:
若S=V,则算法结束,否则转⑵。
3、输入
第一行:
样本顶点个数,假设为n。
第二行,n个顶点(用空格隔开)
第三行开始到n+2行:
每一行是某顶点(按第二行的输入为序)与其它顶点的距离(-1表示无穷大)
第n+3行:
开始顶点
4、输入样本
5
abcde
-15-1715
-1-15-1-1
-1-1-1-11
-1-12-1-1
-1-1-1-1-1
a
5、输出
共计n行(图中顶点数目)
每行是(与输入顺序相同)某顶点(距离):
路径(顶点序列,用空格隔开,回车前无空格)
6、输出样本
a(0):
b(5):
ab
c(9):
adc
d(7):
ad
e(10):
adce
(二)拓扑排序(选作)
1、问题描述
已知有向图,顶点从0开始编号,求它的求拓扑有序序列。
2、拓扑排序算法:
给出有向图邻接矩阵
(1)逐列扫描矩阵,找出入度为0且编号最小的顶点v
(2)输出v,并标识v已访问
(3)把矩阵第v行全清0
重复上述步骤,直到所有顶点输出为止
3、输入
第一行输入一个整数t,表示有t个有向图
第二行输入n,表示图有n个顶点
第三行起,输入n行整数,表示图对应的邻接矩阵
以此类推输入下一个图的顶点数和邻接矩阵
4、输出
每行输出一个图的拓扑有序序列
5、样本输入
2
5
01011
00100
00001
00100
00000
7
0000000
1011000
1000000
1010000
0000011
0100000
0001010
6、样本输出
01324
4651320
四、程序清单
1:
#include
usingnamespacestd;
#defineMAX10
#defineIni100
charPath[MAX][MAX];
intDest[MAX];
typedefstruct{
charVertex[MAX];
intVertexNum;
intAdj[MAX][MAX];
}Graph;
GraphG;
voidCreateGraph(Graph&G){
inti;
cin>>G.VertexNum;
for(i=1;i<=G.VertexNum;i++){
cin>>G.Vertex[i];
}
for(i=1;i<=G.VertexNum;i++){
for(intj=1;j<=G.VertexNum;j++){
cin>>G.Adj[i][j];
if(G.Adj[i][j]==-1)
G.Adj[i][j]=Ini;
}
}
}
voidCreatePath(Graph&G,charStartVertex){
intStartVex,MinDest,i,j,m,CurrentVex;
charFinal[MAX];
for(i=1;i<=G.VertexNum;i++){
if(G.Vertex[i]==StartVertex){
StartVex=i;
break;
}
}
for(i=1;i<=G.VertexNum;i++){
Path[i][0]=0;
Dest[i]=Ini;
if(G.Adj[StartVex][i]Dest[i]=G.Adj[StartVex][i];
Path[i][1]=G.Vertex[StartVex];
Path[i][2]=G.Vertex[i];
Path[i][0]=2;
}
Final[i]='F';
}
Dest[StartVex]=0;
Final[StartVex]='T';
for(i=1;i<=G.VertexNum;i++){
MinDest=Ini;
for(j=1;j<=G.VertexNum;j++){
if(Final[j]=='F'){
if(Dest[j]CurrentVex=j;
MinDest=Dest[j];
}
}
}
Final[CurrentVex]='T';
for(j=1;j<=G.VertexNum;j++){
if((Final[j]=='F')&&(MinDest+G.Adj[CurrentVex][j]Dest[j]=MinDest+G.Adj[CurrentVex][j];
for(m=0;m<=Path[CurrentVex][0];m++)
Path[j][m]=Path[CurrentVex][m];
Path[j][0]++;
Path[j][m]=G.Vertex[j];
}
}
}
}
voidShow(Graph&G){
inti;
intj;
for(i=1;i<=G.VertexNum;i++)
{
cout<";
for(j=1;j<=Path[i][0];j++)
{
cout<<""<}
cout<}
}
intmain()
{
//freopen("cjin.txt","r",stdin);
chara;
CreateGraph(G);
cin>>a;
CreatePath(G,a);
Show(G);
return0;
}
2:
#include
usingnamespacestd;
constintMAX_VERT=10;
structGraphic{
intvertNum;
intVertValue[MAX_VERT];
intAdjMatrix[MAX_VERT][MAX_VERT];
boolvisited[MAX_VERT];
};
voidinitGraphic(Graphic&G,intn){
G.vertNum=n;
inti,j;
for(i=0;ifor(j=0;jcin>>G.AdjMatrix[i][j];
}
for(i=0;iG.VertValue[i]=i;
G.visited[i]=false;
}
}
voidTopoSort(GraphicG){
inti,j,k,m;
for(m=0;mfor(i=0;ifor(j=0;jif(G.AdjMatrix[j][i])
break;
}
if(j==G.vertNum&&!
G.visited[i])
break;
}
cout<
for(k=0;kG.AdjMatrix[i][k]=0;
G.visited[i]=true;
}
cout<}
intmain()
{
intt,n,i;
GraphicG[2];
freopen("tin1.txt","r",stdin);
cin>>t;
for(i=0;icin>>n;
initGraphic(G[i],n);
TopoSort(G[i]);
}
return0;
}
五、程序运行时截图
6、实验心得与体会(实验中遇到的问题及解决方案,或写点感想)
2:
1:
指导教师批阅意见:
成绩评定:
指导教师签字:
年月日
备注:
注:
1、报告内的项目或内容设置,可根据实际情况加以调整和补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。