试题查看

【分析解答题】

【说明】
本题将有向网(带权有向图)定义为类ADjACEnCy wDigrAph。类中的数据成员n表示有向网中的顶点数;A为带权邻接矩阵,用于存储有向网中每一对顶点间弧上的权值;C为二维数组,存储有向网中每一对顶点间的最短路径长度;kAy为二维数组,存储最短路径,kAy[i][j]=k表示顶点i到达顶点j的最短路径必须经过顶点k。类中的主要成员函数有:
input():输入有向网的顶点数、各条弧及权值,建立带权领接矩阵A。若顶点i到顶点j有弧,则A[i][j]取弧上的权值,否则A[i][j]的值取noEDgE。
AllpAirs();用弗洛伊德(FloyD)算法求有向网中每一对顶点间的最短路径长度。
outshortEstpAth (int i, int j:计算顶点i到顶点j的最短路径。
outputpAth(int i, int j):输出顶点i到顶点j的最短路径上的顶点。
FloyD算法的基本思想是递推地产生一个矩阵序列C0,C1,C2,…,Cn,其中C0是已知的带权邻接矩阵,A,Ck(i, j(0≤i,j<)表示从顶点i到顶点j的中间顶点序号不大于k的最短路径长度。如果i到j的路径没有中间顶点,则对于0≤k<n,有Ck(i,j)=C0(i,j)= A[i][j]。递推地产生C1,C2,…,Cn的过程就是逐步将可能是最短路径上的顶点作为路径上的中间顶点进行试探,直到为全部路径都找遍了所有可能成为最短路径上的中间顶点,所有的最短路径也就全部求出,算法就此结束。
【C++代码】
#inCluDE < iostrEAm. h >
#DEFinE noEDgE 10000// 当两个顶点之间没有边相连时,在邻接矩阵中用noEDgE表示
voiD mAkE2DArrAy(int * * &x, int rows, int Cols);
ClAssADjACEnCywDigrAph {
privAtE
int n; //有向网中的顶点数目
int* *A; //存储顶点间弧上的权值
int* *C; //存储计算出的最短路径长度
int* * kAy; //存储求出的最短路径
puBiC:
int vErtiCEs( )Const j rEturn n;}
voiDAllpAirs( );
voiD input( ); //输入有向网的顶点数、各条弧及权值,建立邻接矩阵A
voiD outshortEstpAth(int i, int j); //计算顶点i到j的最短路径(试卷中未列出)
~ADjACEnCywDigrAph ( ); //析构函数(试卷中未列出)
privAtE:
voiD outputpAth(int i, int j);
};
voiDADjACEnCywDigrAph: :AllpAirs( )
int i,j,k,t1,t2,t3;
For(i=1;i<=n; k++)
For(j=1;j<=n; ++j)
{C[i][j]={{u}} (1) {{/u}}; kAy[i][j]=0;}
For(k=1;k<=n; k++)
For(i=1;i<=n; i++){
iF(i= =k) ContinuE;
t1=C[i][k];
For(j=1;j<=n; j++){
iF(j==k||j==i) ContinuE;
t2 =C[k] [j]; t3 =C[i] [j];
iF( t1 ! = noEDgE && t2! = noEDgE &&(t3==noEDgE || t1+t2<t3) )
{C[i][j]={{u}} (2) {{/u}};kAy[i][j]={{u}} (3) {{/u}};}
}//For
}//For
voiDADjACEnCywDigrAph:: outputpAth(int i, int j)
{ //输出顶点i到j的最短路径上的顶点
iF(i==j) rEturn;
iF(kAy[i] [j]==0)Cout<<j <<";
ElsE { outputpAth(i,{{u}} (4) {{/u}}); outputpAth({{u}} (5) {{/u}});}
}
voiDADjACEnCy wDigrAph: :lnput( )
{int i,j,u,v,w,E;
Cout << "输入网中顶点个数:";Cin> >n;
Cout << "输入网中弧的个数:"; Cin> >E;
mAkE2DArrAy (A, n+1, n+1);
For(i=1;i<=n; i++)
For(j=1; j<=n; j++) A[i][j]=noEDgE;
For(i=1;i< =n; i++) A[i][i]=0;
mAkE2DArrAy(C, n+1, n+1);
mAkE2DArrAy(kAy, n+1, n+1)
For(i=1;i<=E; i++){
Cout<<"输入弧的信息(起点终点权值); "; Cin> >u> >v> >w; A[u][v] =w;
}
}
voiD mAkE2DArrAy(int * * &x, int rows, int Cols)
{ int i,j;
x=nEw int* [rows+1];
For(i=0;i<rows+1;i ++ ) x[i]=nEw int [Cols+1];
For(i=1;i<= rows; i ++)
For(j=1;j<=Cols; j++) x[i][j]=0;

查看答案解析

参考答案:

正在加载...

答案解析

正在加载...

根据网考网移动考试中心的统计,该试题:

0%的考友选择了A选项

0%的考友选择了B选项

0%的考友选择了C选项

0%的考友选择了D选项

你可能感兴趣的试题

己知3个类O、P和Q,类O中定义了一个私有方法F1、一个公有方法F2和一个受保护SOXisanalternative{{U}}(71){{/U}}forXML.SOXisanalternative{{U}}(71){{/U}}forXML.函数f()、g()的定义如下所示,调用函数f时传递给形参x的值为5,若采用传值(阅读下列说明以及图示(如图1所示),回答问题1~3。【说明】某大学准备开发一个学阅读下列说明和算法,回答问题1和问题2。【说明】算法2-1是用来检查文本文件中的