P3
1.1 Social
Network
该问题主要根据一个朋友圈的关系网建立一个无向图,并且计算出任意给定的两个人之间的距离。
主要考察了数据结构中有关图方面的知识,如广度优先搜索,邻接表的建立,以及Java中关于对象,类和方法的应用。
1.1.1 设计/实现FriendshipGraph类
l 设计思路:
² 要实现向图中添加点和边以及计算图中任意两点距离的方法;
² 其中需要注意不能向图中重复添加点或者边,所以添加点或者边时要判断当前图中是否已经添加了此点或者此边,若重复添加,则输出错误提示信息并终止程序运行;
² 另添加边时要注意边的两个顶点不能是同一个人,而且要注意如果要在两个 Person 对象 A 和 B 之间增加一条
社交关系,那么需要同时调用 addEdge(A,B)和
addEdge(B,A)两条语句,这样以便以后无向图向有向图的扩展。
l 主要介绍实现计算任意两人之间距离的设计思路
整体思路如下:
首先判断name1和name2是否满足以下三个的其中之一:
² 判断name2在整个关系图中是否为孤立点(即没有任何边可以到达该点)若是,则直接返回-1(这样避免了从name1进行大量的广搜而没有搜索到name2而进行的许多不必要的操作)
² 判断name1和name2是否是直接朋友,若是则返回1
² 判断name1和name2是否是同一个人,若是则返回0
若不满足上面三个,则运用图的广搜计算两人的距离,如下:
首先标记图中所有人的属性distance(该属性主要用来表示name1和name2之间的距离)为0,将name1标记为已访问点,使name1的所有朋友进入队列,并标记这些点为已访问点,并将其属性distance加1;
判断队列是否为空,若为空,直接返回-1,否则让队首出队,并判断其朋友是否包含name2,若包含则name1和name2的距离为队首的distance+1;若不包含则让队首的朋友中未访问过的人入队,并将这些人的属性distance赋值为队首的distance+1;然后重新判断队列是否为空,并重复上述操作,直至循环结束或退出循环,返回距离。
1.1.1 设计/实现Person类
l 设计思路:
² Person类主要用来设置有关每个人的信息的属性,如名字,他所有的朋友,以及辅助在计算两个人之间的距离时的辅助信息,如该点是否被访问过,该点在关系网中是不是孤立点(即没有任一条边可到达该点),以及记录两个人之间的距离
² 由于设置了person类中的属性都为private,所以构造了一些方法用来访问这些属性或者改变这些属性的值,如下图所示: