距離向量算法

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章