栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

哈工大软件构造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,就可以算出步长,这个步长就是最短路径。 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/949891.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号