云南大学软件学院计算机网络原理实验七Word文档下载推荐.docx
《云南大学软件学院计算机网络原理实验七Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《云南大学软件学院计算机网络原理实验七Word文档下载推荐.docx(13页珍藏版)》请在冰点文库上搜索。
Dijkstra算法,其主要思想是计算从某节点(源节点,u)
到网络中所有其他节点的最短路径。
其算法是迭代算法,即经算法的第k次迭代后,可知道到k个目的节点的最低费用路径,在在到所有目的节点的最低费用路径之中,这
k条路径具有k个最低费用。
(2)通过图表算出任何两个节点之间的最短路径,并给出每个节点上的转发表。
截图:
5303
oO
「一O3HoU
nW-*cuw—•"
―I11
■ifiJlD;
\llD€\codebllock\c++■codV'
.Pijksrra-exe请输入节点卜敌t6
请输入起始节点*B
日标节点:
A最低费川路径足:
B——>
A
晟低様用:
2
目标*点:
C晟低费用路径绘:
|b—>
c
最低费用:
3亠__
LI标廿点:
D就低费川路栓足:
B—>
D
显低费用:
2
U标廿点:
E显低费川路栓足:
B—-〉D>
E显低费用:
3叶科科armnininhmrrK*
F嚴低费用路於足:
B——〉[)—>
e——>
F最低费用:
5*杠卄科科杆和是否缔续:
y:
是n:
否
粉输入起始"
点:
FI标节点:
很低费用略徒足:
D—>
叫0玄出Ll—-忖标节点:
B
跟低费用路径足:
最低费用:
!
1沙心:
C
最低费川路砒:
D—>
E~>
銀低费用:
******車*車*車***拿卓拿*車**
H标筋点:
E
谥低费用粘松是:
卜一>
限低费用:
】
H标节点:
F掖低汲用略能绘:
E——>
F限低费用:
3蘇蕊厂;
;
辽二:
■^ISD:
\IDE\codeblock\c++code\Dijkstra.exe
诒输入起的节点:
忖标节点:
A加低费用坷怆绘:
E—>
D~>
Aid低费用:
************宰*****客**
冃标节点:
B最低费用路径是:
£
一>
B扱低费川:
3
****#*4:
代**粒软*宜**4***
『I标”点:
记低费用略检足:
區低费用:
1
****斗**材林*木********
n标霸点:
d
區低费用路径建:
D阴低巧田订
I」标卩点:
F彊低费用路伦址:
F區低费用:
iff输人起始节点:
F
II标卄点:
A最祗瀬用路径忌FE—'
DA
尿低哉用:
4
**»
**+*****+*******¥
*
11标节点;
晟低费甬路牲是:
F—E>
BB
5
亡虽曲榄用路径是:
F--->
E-一>
拥低册用:
*********************
H标节点:
n隔低费用跻植是:
F->
E—>
:
D彊低婕用:
¥
*******¥
******伙松**
II哪*T:
E员低瓒用略植足:
最低瓒用:
甲艸艸艸艸艸艸*寧******
足沔做红:
尸足n:
Pr
ProcesEreturnpd1(0x1)esecutiontime:
1060.536sPressanykeytocontinue.
转发表:
A:
目的地
链路
最低费用
A>
A->
D->
E->
B:
B->
C:
C->
D:
E:
F:
F->
源代码:
#include<
iostream>
stdio.h>
usingnamespacestd;
constintMAX=1000;
constintOK=1;
constintFALSE=0;
constintTRUE=1;
voidcreateGraph(int*arcs[],int&
num)
{
cout<
<
"
请依次输入各点的各条路径的cost:
endl<
(如果拓扑图中的顶点没有直接相
连,则输入1000)"
endl;
"
for(inti=0;
i<
num;
i++)
arcs[i]=newint[num];
for(intj=O;
j<
j++)
cin>
>
arcs[i][j];
}
}voidinitRoute(int*R[],intRL[],intvNum){
for(inti=0;
vNum;
RL[i]=MAX;
R[i]=newint[vNum];
for(intj=0;
R[i][j]=-1;
voidupdateRoute(intR1[],intR2[],intdest,intnum)
for(inti=0;
num;
i++)R1[i]=R2[i];
for(intj=0;
if(R1[j]==-1)
R1[j]=dest;
break;
voidDijkstra(int*arcs[],int*R[],intRL[],intvexnum)
chartemp;
intv0;
bool*visit=newbool[vexnum];
cout<
请输入起始节点:
;
cin>
>
temp;
v0=(int)temp-65;
//A的ASCII码是65cout<
endl;
if(v0>
=vexnum)
输入错误,请重新输入"
v0;
else
for(intcnt=0;
cnt<
vexnum;
cnt++)
visit[cnt]=FALSE;
//visit临时存储已经求得的最短路径RL[cnt]=arcs[v0][cnt];
if(RL[cnt]<
MAX)
R[cnt][0]=v0;
R[cnt][1]=cnt;
}RL[v0]=0;
visit[v0]=TRUE;
for(inti=1;
intmin=MAX;
intv=v0;
j++)if(!
visit[j])if(RL[j]<
min)
v=j;
min=RL[j];
visit[v]=TRUE;
for(intk=0;
k<
k++)if(!
visit[k]&
&
(min+arcs[v][k]<
RL[k])){
RL[k]=min+arcs[v][k];
updateRoute(R[k],R[v],k,vexnum);
}visit=NULL;
voidprintRoute(int*R[],intRL[],intvNum)
intq=0;
for(intdest=0;
dest<
dest++)
if(RL[dest]!
=0)
printf("
目标节点:
%c\n"
dest+65);
if(R[dest][0]==-1)
最短路径不存在!
continue;
最低费用路径是:
if(R[dest][j]!
=-1)
{printf("
%c"
R[dest][j]+65);
(R[dest][j]==dest?
\n"
--->
);
break;
RL[dest]<
最低费用
intmain()
intvNum;
请输入节点个数:
while(vNum<
0)
输入个数错误!
请重新输入:
你输入的"
vNum<
个节点将按0--"
vNum-1<
顺序组成的邻接矩阵存储权值"
int**weight=newint*[vNum];
int**shortestRoute=newint*[vNum];
int*routeLen=newint[vNum];
createGraph(weight,vNum);
charisExit='
y'
do
{initRoute(shortestRoute,routeLen,vNum);
Dijkstra(weight,shortestRoute,routeLen,vNum);
printRoute(shortestRoute,routeLen,vNum);
是否继续:
y:
是n:
否"
isExit;
if(isExit=='
n'
)break;
}while(isExit=='
returnOK;
315
011000
10001102
10005100020
谛输入起蛤惜豔A
艮标打点:
人—>
8砒低即用:
********************卓
II杯仃点X
锻住掛用路袴足:
—>
E—>
***冷**#***#*=<
**琲**平**
日輛节■左:
晟低锵用賂枪是:
A——>
显仏抄口:
*****期******木*丰*甘材*
R林节点:
最低桃用略1±
足:
A'
'
D>
说低nnj:
***inif**)|f»
*«
****Hir)tn|!
H标肯点;
尬低费川确悴足:
i、\iC
忑低费用;
**黑辱丰之=g卞捲*窃乂总*哮膽窃***
是朴诜铁:
丫:
是;
口:
仰