给定代表社交网络的数据结构,编写一个找到某种程度的朋友的函数。第一学位的朋友是会员的直系朋友,第二学位的朋友是会员朋友的朋友,不包括第一学位的朋友等。
例如,如果A是B的朋友而B是C的朋友,那么GetFriendsOfDegree(A,2)应该返回C,因为C是A的唯一二级朋友(B是A的一级朋友) )。
Method name: GetFriendsOfDegree
using System;
using System.Collections.Generic;
public class Member
{
public string Email { get; private set; }
public ICollection<Member> Friends { get; private set; }
public Member(string email) : this(email, new List<Member>())
{
}
public Member(string email, ICollection<Member> friends)
{
this.Email = email;
this.Friends = friends;
}
public void AddFriends(ICollection<Member> friends)
{
foreach (Member friend in friends)
this.Friends.Add(friend);
}
public void AddFriend(Member friend)
{
this.Friends.Add(friend);
}
}
public class Friends
{
public static List<Member> GetFriendsOfDegree(Member member, int degree)
{
throw new NotImplementedException("Waiting to be implemented.");
}
public static void Main(string[] args)
{
Member a = new Member("A");
Member b = new Member("B");
Member c = new Member("C");
a.AddFriend(b);
b.AddFriend(c);
foreach (Member friend in GetFriendsOfDegree(a, 2))
Console.WriteLine(friend.Email);
}
}
答案 0 :(得分:1)
这是一个可以使用breadth-first search算法解决的图形问题。您将图表表示为adjacency list非常适合实现BFS算法。
创建一对(Member, distance)
对,以及一组访问过的成员。推动初始成员的距离为零。
创建一个从队列中读取的循环,并检查该成员是否是访问集的一部分。如果是,请放弃该对并继续。否则,请推送当前成员的所有朋友,距离为d+1
,其中d
是您已出列成员的距离。
当距离达到目标距离degree
时,将成员收集到结果列表中。继续循环,直到队列为空。