哈工大软件构造lab1部分问题心得(二)

这部分心得主要探讨最后一个问题Social Network。该任务的目标为设计一张社交网络有向图,连接互为朋友的人与人,并且能计算任意两人之间需要的最少的关联路径。该问题为最短路径问题,而构建的图为有向无权图,所以利用DFS深度优先遍历即可得到两点间的最短路径。算法这一块我掌握得一直不好,所以再记录一次复习一下。

一、设计/实现FriendshipGraph类

选择用邻接表存图。

用HashMap构造一个邻接表,每个key是一个Person类,value为集合类,存储和该点有朋友关系的所有点,类比C语言的链表结构。

①addVertex函数

函数要求向关系图中加入一个点,即Person类的一个person,同时需要判断是否出现重名。没有重名,则讲该person放入FSGList邻接表中。实现如下:

②addEdge函数

函数要求在关系图中的两个点间增加一条边。需要判断两个点是否在关系图中且两个点是否不同。由于是有向图,所以邻接表中只向start的集合类中加入end。实现如下:

 

③getDistance函数

该函数需要计算出关系图中两个点之间最短路径,如果两个点没有路径连接,那么输出-1。这里使用BFS算法实现。

首先将FSGList中的每个Person类变量的成员变量初始化:

 

这里setStep方法用于计算从起始点到当前每个点走过的步数,也就是路径长度。setVisited方法用于判断当前点是否被访问过。

需要使用队列完成操作。队列里的每个元素即一个Person类对象。

之后就是通过队列循环找出路径长度。BFS算法实现如下: 

其中setVisited就是用来判断这个点是否被访问过。setStep就是设置步长,当前点的步长加1即为和它邻接点的步长(前提是这个点没有访问过),这样一直循环到点为end,就可以算出步长,这个步长就是最短路径。 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值