c语言实现深度优先算法计算最短路径

题目:10 个节点 N1​,…,N10​ 构成一个计算机局域网, 它们之间的连接关系及通讯延时如下表所示。

(N1​,N2​,2),(N1​,N3​,3),(N1​,N4​,3),(N2​,N4​,4), (N2​,N5​,5),(N3​,N4​,1),(N3​,N7​,6),(N3​,N6​,5), (N4​,N5​,7),(N4​,N6​,4),(N4​,N7​,6),(N5​,N8​,6), (N7​,N8​,4),(N6​,N8​,5),(N6​,N9​,7),(N8​,N10​,7), (N9​,N10​,6)

计算 N1​ 至 N10​ 的延时最短的路径,以 及相应的延时值。 节点连接关系如上,如 (N1​,N2​,2) 表示 N1​ 与 N2​ 相连,延时值为 2 秒。

通过手算得到N1到其他点的最短路径如下图所示(下图p值,即最后的tem值)

c语言代码如下,本代码实现的是十个点最短路径,可以稍加修改扩大

#include <stdio.h>
#include <stdlib.h>
#define MIN(i, j) (((i) < (j)) ? (i) : (j))    //比较两个数,取小的值
int miv;                                       //两个全局变量,当做最小指示
int mi;
void fmin(int tem[11],int p[11]){             //找到p为零,tem最小的节点,将p置1
    miv=200;
    for(int i=1;i<11;i++){
        if(p[i]==0&&tem[i]<miv){
        miv=tem[i];
        mi=i;
        p[mi]=1;
        }
    }
}
void fneib(int b[11][11],int tem[11],int mi,int fron[11]){ 
                                    //此节点指向下几个节点,将他们的tem置为此节点tem+路长
    for(int i=1;i<11;i++){
        int gen=0;
        if(b[mi][i]!=0){
        gen=b[mi][i]+tem[mi];
        if(gen<tem[i]){
            tem[i]=gen;
            fron[i]=mi;
        }
        }
    }
}

int main()
{
    int b[11][11]={0};        //创建路径矩阵,b[i][j]表示Ni到Nj的距离,初始全为0
    b[1][2]=2;
    b[1][3]=3;
    b[1][4]=3;
    b[2][4]=4;
    b[2][5]=5;
    b[3][4]=1;
    b[3][6]=5;
    b[3][7]=6;
    b[4][6]=4;
    b[6][8]=5;
    b[6][9]=7;
    b[8][10]=7;
    b[9][10]=6;

    b[2][1]=2;                         //无向路径,反过来再来一次
    b[3][1]=3;
    b[4][1]=3;
    b[4][2]=4;
    b[5][2]=5;
    b[5][3]=5;
    b[4][3]=1;
    b[7][3]=6;
    b[8][6]=5;
    b[4][6]=4;
    b[9][6]=7;
    b[10][8]=7;
    b[10][9]=6;
    int tem[11],p[11],fron[11];       //暂时指示tem[i],永久指示p[i]
    for(int i=1;i<11;i++){            //初始化参数
        tem[i]=100;
        p[i]=0;
        fron[i]=0;
    }
    tem[1]=0;
    fron[1]=1;
    while(1){
        fmin(tem,p);                   //调用函数,取所有tem最小值
        printf("%d,%d\n",miv,mi);
        fneib(b,tem,mi,fron);          //调用函数,使下几个节点tem更新
        for(int i=1;i<11;i++){
            printf("p[%d]:%d,tem:%d\n\n",i,p[i],tem[i]);
        }
        int over=1;
        for(int i=1;i<11;i++){         //当所有永久指示p都为1时结束
            if(p[i]==0)over=0;
        }
        if (over==1)
        break;
    }
    for(int i=1;i<11;i++){
        printf("tem[%d]=%d,fron:%d\n",i,tem[i],fron[i]);
    }
    printf("\n\nthe nearest route from N1 to N10 is %d\n",tem[10]);
    return 0;
}

  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值