计算机网络矢量算法三个更新原则,模拟简单距离向量算法的更新——计算机网络作业...

#includeusing namespace std;

struct rtpkt{ //no节点编号,a[i]为该节点的距离矢量

int no;

int a[4];

}rtpkt0,rtpkt1,rtpkt2,rtpkt3;

void rtinit0();

void rtinit1();

void rtinit2();

void rtinit3();

void rtupdate0(rtpkt rcvpkt);

void rtupdate1(rtpkt rcvpkt);

void rtupdate2(rtpkt rcvpkt);

void rtupdate3(rtpkt rcvpkt);

int main(){

rtinit0();

rtinit1();

rtinit2();

rtinit3();

rtupdate1(rtpkt0); //利用第一个节点的距离矢量更新其他三个节点的距离矢量

rtupdate2(rtpkt0);

rtupdate3(rtpkt0);

/*

cout << rtpkt0.no << " " << rtpkt0.a[0] << rtpkt0.a[1] << rtpkt0.a[2] << rtpkt0.a[3] << endl;

cout << rtpkt1.no << " " << rtpkt1.a[0] << rtpkt1.a[1] << rtpkt1.a[2] << rtpkt1.a[3] << endl;

cout << rtpkt2.no << " " << rtpkt2.a[0] << rtpkt2.a[1] << rtpkt2.a[2] << rtpkt2.a[3] << endl;

cout << rtpkt3.no << " " << rtpkt3.a[0] << rtpkt3.a[1] << rtpkt3.a[2] << rtpkt3.a[3] << endl;

*/

rtupdate0(rtpkt1); //利用第二个节点的距离矢量更新其他三个节点的距离矢量

rtupdate2(rtpkt1);

rtupdate3(rtpkt1);

/*

cout << rtpkt0.no << " " << rtpkt0.a[0] << rtpkt0.a[1] << rtpkt0.a[2] << rtpkt0.a[3] << endl;

cout << rtpkt1.no << " " << rtpkt1.a[0] << rtpkt1.a[1] << rtpkt1.a[2] << rtpkt1.a[3] << endl;

cout << rtpkt2.no << " " << rtpkt2.a[0] << rtpkt2.a[1] << rtpkt2.a[2] << rtpkt2.a[3] << endl;

cout << rtpkt3.no << " " << rtpkt3.a[0] << rtpkt3.a[1] << rtpkt3.a[2] << rtpkt3.a[3] << endl;

*/

rtupdate0(rtpkt2); //利用第三个节点的距离矢量更新其他三个节点的距离矢量

rtupdate1(rtpkt2);

rtupdate3(rtpkt2);

/*

cout << rtpkt0.no << " " << rtpkt0.a[0] << rtpkt0.a[1] << rtpkt0.a[2] << rtpkt0.a[3] << endl;

cout << rtpkt1.no << " " << rtpkt1.a[0] << rtpkt1.a[1] << rtpkt1.a[2] << rtpkt1.a[3] << endl;

cout << rtpkt2.no << " " << rtpkt2.a[0] << rtpkt2.a[1] << rtpkt2.a[2] << rtpkt2.a[3] << endl;

cout << rtpkt3.no << " " << rtpkt3.a[0] << rtpkt3.a[1] << rtpkt3.a[2] << rtpkt3.a[3] << endl;

*/

rtupdate0(rtpkt3); //利用第四个节点的距离矢量更新其他三个节点的距离矢量

rtupdate1(rtpkt3);

rtupdate2(rtpkt3);

//打印结果

cout << rtpkt0.no << " " << rtpkt0.a[0] << rtpkt0.a[1] << rtpkt0.a[2] << rtpkt0.a[3] << endl;

cout << rtpkt1.no << " " << rtpkt1.a[0] << rtpkt1.a[1] << rtpkt1.a[2] << rtpkt1.a[3] << endl;

cout << rtpkt2.no << " " << rtpkt2.a[0] << rtpkt2.a[1] << rtpkt2.a[2] << rtpkt2.a[3] << endl;

cout << rtpkt3.no << " " << rtpkt3.a[0] << rtpkt3.a[1] << rtpkt3.a[2] << rtpkt3.a[3] << endl;

return 0;

}

void rtinit0(){ //初始化第一个节点的距离矢量

rtpkt0.no = 0;

rtpkt0.a[0] = 0;

rtpkt0.a[1] = 1;

rtpkt0.a[2] = 3;

rtpkt0.a[3] = 7;

}

void rtinit1(){ //初始化第二个节点的距离矢量

rtpkt1.no = 1;

rtpkt1.a[0] = 1;

rtpkt1.a[1] = 0;

rtpkt1.a[2] = 1;

rtpkt1.a[3] = -1;

}

void rtinit2(){ //初始化第三个节点的距离矢量

rtpkt2.no = 2;

rtpkt2.a[0] = 3;

rtpkt2.a[1] = 1;

rtpkt2.a[2] = 0;

rtpkt2.a[3] = 2;

}

void rtinit3(){ //初始化第四个节点的距离矢量

rtpkt3.no = 3;

rtpkt3.a[0] = 7;

rtpkt3.a[1] = -1;

rtpkt3.a[2] = 2;

rtpkt3.a[3] = 0;

}

void rtupdate0(rtpkt rcvdpkt){ //rtupdate0为该节点,rcvdpkt为指定节点

if(rtpkt0.a[rcvdpkt.no] <= 0){

/*如果该节点到指定节点的距离为0(即相同的一点)或-1(不可达),则返回*/

return;

}

for(int i = 0; i < 4; i++){

if(rcvdpkt.a[i] < 0) {

/*如果指定节点到目的节点不可达,则跳过一下步骤继续执行*/

continue;

}

else if(rtpkt0.a[i] < 0){

rtpkt0.a[i] = rcvdpkt.a[i] + rtpkt0.a[rcvdpkt.no];

/*如果该节点到目的节点不可达,则直接更新距离*/

}

else {

rtpkt0.a[i] = min(rtpkt0.a[i], rcvdpkt.a[i] + rtpkt0.a[rcvdpkt.no]);

/*否则将距离更新为两者之间的较小值*/

}

}

}

void rtupdate1(rtpkt rcvdpkt){

if(rtpkt1.a[rcvdpkt.no] <= 0){

return;

}

for(int i = 0; i < 4; i++){

if(rcvdpkt.a[i] < 0) {

continue;

}

else if(rtpkt1.a[i] < 0){

rtpkt1.a[i] = rcvdpkt.a[i] + rtpkt1.a[rcvdpkt.no];

}

else{

rtpkt1.a[i] = min(rtpkt1.a[i], rcvdpkt.a[i] + rtpkt1.a[rcvdpkt.no]);

}

}

}

void rtupdate2(rtpkt rcvdpkt){

if(rtpkt2.a[rcvdpkt.no] <= 0){

return;

}

for(int i = 0; i < 4; i++){

if(rcvdpkt.a[i] < 0) {

continue;

}

else if(rtpkt2.a[i] < 0){

rtpkt2.a[i] = rcvdpkt.a[i] + rtpkt2.a[rcvdpkt.no];

}

else{

rtpkt2.a[i] = min(rtpkt2.a[i], rcvdpkt.a[i] + rtpkt2.a[rcvdpkt.no]);

}

}

}

void rtupdate3(rtpkt rcvdpkt){

if(rtpkt3.a[rcvdpkt.no] <= 0){

return;

}

for(int i = 0; i < 4; i++){

if(rcvdpkt.a[i] < 0) {

continue;

}

else if(rtpkt3.a[i] < 0){

rtpkt3.a[i] = rcvdpkt.a[i] + rtpkt3.a[rcvdpkt.no];

}

else {

rtpkt3.a[i] = min(rtpkt3.a[i], rcvdpkt.a[i] + rtpkt3.a[rcvdpkt.no]);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值