【最短路径问题】关系网络 Python进行深度优先、广度优先两种方法求解

【题目】关系网络

有n个人,他们的编号为1~n,其中有一些人相互认识,现在x想要认识y,可以通过他所认识的人来认识更多的人。

例如:如果a认识b、b认识c,那么a可以通过b来认识c

求出x最少需要通过多少人才能认识y?

【输入格式】

第一行三个整数n、x、y,接下来一个n×n的邻接矩阵,a[i,j]=1表示i认识j,0表示不认识。保证i=j时,a[i,j]=0,并且a[i,j]=a[j,i]。

【输出格式】

x认识y最少需要通过的人数。数据保证x一定能认识y

【样例输入】

5 1 5

0 1 0 0 0

1 0 1 1 0

0 1 0 1 0

0 1 1 0 1

0 0 0 1 0

【样例输出】

2

【实验过程】

  1. 实验原理

使用邻接矩阵进行存储,这个问题本质上就是一个最短路劲问题,在最短路径问题里使用的比较多的是Dijkstra算法和Floyd算法,本实验使用广度优先和深度优先进行解决。

广度优先:使用一个队列——一个一维数组,用两个变量来标记队首和队尾,在可以走向下一步时进行步数加一并更新队尾标记该结点走过,枚举到后再把步数输出。

深度优先:深度优先在进行最短路径求解时要把所有路径都遍历一遍每次得到的路径长度和之前的进行对比,如果更短则更新。

  1. 实验代码

2.1 BFS实验代码

import numpy as np

f = np.zeros((100, 2), dtype=np.int)

tt = np.zeros(100)



n,x,y=input().split()

n=int(n)

x=int(x)

y=int(y)



a = [([0] * (n+1)) for i in range(n+1)]



for i in range(1,n+1):

    a[i] = input().split(" ")

    for j in range(n):

        a[i][j]=int(a[i][j])



for i in range(1,n+1):

    a[i].insert(0,0)



tt[x] = 1#标记走过

f[1][1] = x#x是起点

t=1#队列

h=1



while t>=h :

    tx=f[h][1]#曲首

    if tx == y:#枚举到了

        out = f[h][0]-1

        print(out)#输出

        break

    for i in range(1,n+1):

        if a[i][tx]==1 and tt[i]!=1:

            t = t+1#更新队尾

            f[t][0]=f[h][0]+1#记录步数

            f[t][1] = i#记录位置

            tt[i] = 1#标记用过

    h=h+1#下一个队首

   

2.2 DFS实验代码

import numpy as np



book = np.zeros(100)

e = [([0] * (101)) for i in range(101)]

mm = 9999999

path = np.zeros(100)#保存最短路径

n=0



def DFS(cur,tem,dis):

    global mm

    if n == cur:

        '''

        for i in range(1,n+1):

            if path[i] != 0:

                print(path[i])

        print("路径长度=",dis)

        '''

        if mm>dis:

            mm = dis

        #return

   

    for i in range(cur,tem+1):

        if e[cur][i]!=99999 and book[i]==0:

            book[i]=1

            path[i]=i

            DFS(i,tem,dis+e[cur][i])

            book[i] = 0

            path[i] = 0

           

if __name__ == "__main__":

    n,x,y=input().split()

    n=int(n)

    x=int(x)

    y=int(y)



    e = [([0] * (n+1)) for i in range(n+1)]



    for i in range(1,n+1):

        e[i] = input().split(" ")

        for j in range(n):

            e[i][j]=int(e[i][j])

    for i in range(1,n+1):

        e[i].insert(0,0)



    for i in range(1,n+1):

        for j in range(1,n+1):

            if i == j:

                e[i][j]=0

            else:

                if e[i][j] ==0:

                    e[i][j]=99999

    book[1]=1

    path[1]=1

    DFS(x,y,0)

    print(mm-1)

 

3.实验结果

【最短路径问题】关系网络 Python进行深度优先、广度优先两种方法求解_第1张图片

 

 

4.参考资料

[1] 题解-关系网络

https://www.luogu.org/blog/wsr/ti-xie-guan-ji-wang-lao

[2] 城市地图---图的深度优先遍历求最短路径并输出所有路径

https://www.cnblogs.com/lxt1105/p/6440030.html

 

你可能感兴趣的:(【最短路径问题】关系网络 Python进行深度优先、广度优先两种方法求解)