距离向量算法

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值