#include <iostream>
#include <algorithm>
#include <string>
#include <stdio.h>
#include <cstring>
#include <cctype>
#include <cstdio>
#include <stack>
#include <map>
#include <cmath>
#include <queue>
#include <vector>
//#include <bits/stdc++.h>
using namespace std;
struct net{ //路由表记录
int id,length,nxt;
};
struct lyq{
vector<int>nxtlyq; //相邻路由器
vector<int>nexnet; //相邻网络
vector<net>lyb; //路由表
};
lyq list[100];
void update(int r1,int r2){ //r1发给r2,r2是被更新的
for(int i=0;i<list[r1].lyb.size();i++){
int f=0;
for(int j=0;j<list[r2].lyb.size();j++){
if(list[r1].lyb[i].id==list[r2].lyb[j].id){
f=1;
if(list[r2].lyb[j].nxt==r1||list[r1].lyb[i].length+1<list[r2].lyb[j].length) //e如果吓一跳是r1或者距离更近
list[r2].lyb[j].length =list[r1].lyb[i].length+1;
}
}
if(f==0&&list[r1].lyb[i].length+1<16){ //如果不大于16跳即可加入r2没有该条信息需要增加
list[r2].lyb.push_back({list[r1].lyb[i].id,list[r1].lyb[i].length+1,r1});
}
}
}
void print_lyb(int i){
printf("打印路由器:%d的路由表\n",i);
printf("目的网络 距离 下一跳地址\n");
for(int j=0;j<list[i].lyb.size();j++)
if(list[i].lyb[j].length!=0)printf("%d %d %d\n",list[i].lyb[j].id,list[i].lyb[j].length,list[i].lyb[j].nxt);
}
int main(){
for(int i=0;i<4;i++)
list[i].lyb=vector<net>(3);
list[0].nxtlyq.push_back(1);
list[0].nxtlyq.push_back(3);
list[0].nexnet.push_back(0);
list[0].nexnet.push_back(3);
list[0].lyb[0]={3,1,-1};
list[0].lyb[1]={0,1,-1};
list[1].nxtlyq.push_back(0);
list[1].nxtlyq.push_back(2);
list[1].nxtlyq.push_back(3);
list[1].nexnet.push_back(0);
list[1].nexnet.push_back(2);
list[1].nexnet.push_back(3);
list[1].lyb[0]={0,1,-1};
list[1].lyb[1]={2,1,-1};
list[1].lyb[2]={3,1,-1};
list[2].nxtlyq.push_back(1);
list[2].nxtlyq.push_back(3);
list[2].nexnet.push_back(2);
list[2].nexnet.push_back(1);
list[2].lyb[0]={1,1,-1};
list[2].lyb[1]={2,1,-1};
list[3].nxtlyq.push_back(0);
list[3].nxtlyq.push_back(1);
list[3].nxtlyq.push_back(2);
list[3].nexnet.push_back(0);
list[3].nexnet.push_back(1);
list[3].nexnet.push_back(2);
list[3].lyb[0]={0,1,-1};
list[3].lyb[1]={1,1,-1};
list[3].lyb[2]={2,1,-1};
for(int i=0;i<4;i++){
for(int j=0;j<4;j++)
for(int k=0;k<list[j].nxtlyq.size();k++){
int r1 = j,r2 =list[j].nxtlyq[k];
update(r1, r2);
}
printf("第%d次j交换后的路由表\n",i+1);
for(int i=0;i<4;i++)
print_lyb(i);
}
return 0;
}
距离向量算法
于 2019-10-24 23:05:53 首次发布