云南大学软件学院计算机网络原理实验七.docx
《云南大学软件学院计算机网络原理实验七.docx》由会员分享,可在线阅读,更多相关《云南大学软件学院计算机网络原理实验七.docx(13页珍藏版)》请在冰豆网上搜索。
![云南大学软件学院计算机网络原理实验七.docx](https://file1.bdocx.com/fileroot1/2023-2/6/7eb54d50-6f78-424e-baf9-cae0c0b0621d/7eb54d50-6f78-424e-baf9-cae0c0b0621d1.gif)
云南大学软件学院计算机网络原理实验七
实验七、LinkStatesAlgorithm的实现
序号:
姓名:
学号:
2016成绩
1.实验目的:
通过编程模拟实现LSA.
2.实验环境:
VS.net软件开发平台,可以使用任何编程语言。
3.实验要求
(1)求网络中任何两个结点之间的最短路径(网络中至少有4个节点)。
(2)得到任何一个节点上的转发表。
4.实验内容、拓扑结构
通过链路状态算法计算A点到其它各点的cost,最终输出A的路由表。
算法提示:
Initialization:
2N'={u}/*uissourcenode*/
3forallnodesj/*jisdestnode*/
4ifjadjacenttou
5thenD(j)=c(u,j)
6elseD(j)=g
7
7Loop
8findinotinN'suchthatD(i)isaminimum
9additoN'
10updateD(j)foralljadjacenttoiandnotinN':
11D(j)=min(D(j),D(i)+c(i,j))
12/*newcosttojiseitheroldcosttojorknown
13shortestpathcosttoipluscostfromitoj*/
14untilallnodesinN'
4.实验分析,回答下列问题
(1)给出LSA算法的主要思想。
LSA算法即链路状态选路算法,该算法中,网络拓扑
和所有的链路费用都是已知的。
它的具体实现依据
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*
U标廿点:
F嚴低费用路於足:
B——〉[)—>e——>F最低费用:
5*杠卄科科杆和是否缔续:
y:
是n:
否
粉输入起始"点:
D
FI标节点:
A
很低费用略徒足:
D—>A
叫0玄出Ll—-忖标节点:
B
跟低费用路径足:
D—>B
最低费用:
2
!
1沙心:
C
最低费川路砒:
D—>E~>C
銀低费用:
2
******車*車*車***拿卓拿*車**
H标筋点:
E
谥低费用粘松是:
卜一>E
限低费用:
】
H标节点:
F掖低汲用略能绘:
D—>E——>F限低费用:
3蘇蕊厂;;辽二:
否
■^ISD:
\IDE\codeblock\c++code\Dijkstra.exe
诒输入起的节点:
E
忖标节点:
A加低费用坷怆绘:
E—>D~>Aid低费用:
2
************宰*****客**
冃标节点:
B最低费用路径是:
£一>D—>B扱低费川:
3
****#*4:
代**粒软*宜**4***
『I标”点:
C
记低费用略检足:
E——>C
區低费用:
1
****斗**材林*木********
n标霸点:
d
區低费用路径建:
E——>D阴低巧田订
I」标卩点:
F彊低费用路伦址:
E—>F區低费用:
2
iff输人起始节点:
F
II标卄点:
A最祗瀬用路径忌FE—'DA
尿低哉用:
4
**»**+*****+*******¥*
11标节点;B
晟低费甬路牲是:
F—E>BB
最低费用:
5
冃标节点:
亡虽曲榄用路径是:
F--->E-一>C
拥低册用:
3
*********************
H标节点:
n隔低费用跻植是:
F->E—>:
D彊低婕用:
3
¥*******¥******伙松**
II哪*T:
E员低瓒用略植足:
F--->E
最低瓒用:
2
甲艸艸艸艸艸艸*寧******
足沔做红:
尸足n:
Pr
ProcesEreturnpd1(0x1)esecutiontime:
1060.536sPressanykeytocontinue.
转发表:
A:
目的地
链路
最低费用
B
A>B
2
C
A->D->E->C
3
D
A>D
1
E
A->D->E
2
F
A->D->E->F
4
B:
目的地
链路
最低费用
A
B->A
2
C
B->C
3
D
B->D
2
E
B->D->E
3
F
B->D->E->F
5
C:
目的地
链路
最低费用
A
C->E->D->A
3
B
C->B
3
D
C->E->D
2
E
C->E
1
F
C->E->F
3
D:
目的地
链路
最低费用
A
D->A
1
B
D->B
2
C
D->E->C
2
E
D->E
1
F
D->E->F
3
E:
目的地
链路
最低费用
A
E->D->A
2
B
E->D->B
3
C
E->C
1
D
E->D
1
F
E->F
2
F:
目的地
链路
最低费用
A
F->E->D->A
4
B
F->E->D->B
5
C
F->E->C
3
D
F->E->D
3
E
F->E
2
源代码:
#include
#includeusingnamespacestd;
constintMAX=1000;constintOK=1;
constintFALSE=0;constintTRUE=1;
voidcreateGraph(int*arcs[],int&num)
{
cout<<"请依次输入各点的各条路径的cost:
"<连,则输入1000)"<cout<<""<for(inti=0;i{
arcs[i]=newint[num];
for(intj=O;jcin>>arcs[i][j];
}
}voidinitRoute(int*R[],intRL[],intvNum){
for(inti=0;iRL[i]=MAX;
R[i]=newint[vNum];for(intj=0;jR[i][j]=-1;
}
}
voidupdateRoute(intR1[],intR2[],intdest,intnum)
{
for(inti=0;ifor(intj=0;j{
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<if(v0>=vexnum)
{
cout<<"输入错误,请重新输入"<>v0;
}
else
{
for(intcnt=0;cnt{
visit[cnt]=FALSE;//visit临时存储已经求得的最短路径RL[cnt]=arcs[v0][cnt];
if(RL[cnt]{
R[cnt][0]=v0;R[cnt][1]=cnt;
}
}RL[v0]=0;visit[v0]=TRUE;
for(inti=1;i{
intmin=MAX;
intv=v0;
for(intj=0;jvisit[j])if(RL[j]v=j;min=RL[j];
}
visit[v]=TRUE;
for(intk=0;kvisit[k]&&(min+arcs[v][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{
if(RL[dest]!
=0)
{
printf("目标节点:
%c\n",dest+65);
if(R[dest][0]==-1)
{
cout<<"最短路径不存在!
"<continue;
}
else
{
cout<<"最低费用路径是:
"<for(intj=0;j{
if(R[dest][j]!
=-1)
{printf("%c",R[dest][j]+65);cout<<(R[dest][j]==dest?
"\n":
"--->");
}
else
break;
}
}
:
"<cout<<"最低费用
intmain()
{
intvNum;
cout<<"请输入节点个数:
cin>>vNum;
while(vNum<0)
{
cout<<"输入个数错误!
请重新输入:
";cin>>vNum;
}
cout<<""<cout<<"你输入的"<int**weight=newint*[vNum];
int**shortestRoute=newint*[vNum];
int*routeLen=newint[vNum];createGraph(weight,vNum);
cout<<""<charisExit='y';
do
{initRoute(shortestRoute,routeLen,vNum);Dijkstra(weight,shortestRoute,routeLen,vNum);printRoute(shortestRoute,routeLen,vNum);
cout<<"是否继续:
y:
是n:
否";
cin>>isExit;
cout<if(isExit=='n')break;
}while(isExit=='y');
returnOK;
}
315
011000
10001102
10005100020
谛输入起蛤惜豔A
艮标打点:
B
人—>8砒低即用:
2
********************卓
II杯仃点X
锻住掛用路袴足:
&—>D—>E—>C
***冷**#***#*=<**琲**平**
日輛节■左:
D
晟低锵用賂枪是:
A——>D
显仏抄口:
1
*****期******木*丰*甘材*
R林节点:
E
最低桃用略1±足:
A''D>E
说低nnj:
2
***inif**)|f»*«****Hir)tn|!
*
H标肯点;F
尬低费川确悴足:
i、\iC
忑低费用;4
**黑辱丰之=g卞捲*窃乂总*哮膽窃***
是朴诜铁:
丫:
是;口:
仰