C# を使用した私のソリューションです。これは N^2 未満であると確信していますが、もう少し詳しく調べる必要があります。私がそうしている間、批評のために投稿します。
public class Employee
{
public List<Employee> Referred { get; set; }
public string Name { get; set; }
public int CountOfRefer { get; set; }
public bool BeenCounted { get; set; }
public Employee()
{
Referred = new List<Employee>();
}
}
public static void main()
{
Employee A = new Employee(){ Name="A" };
Employee B = new Employee(){ Name="B" };
Employee C = new Employee(){ Name="C" };
Employee D = new Employee(){ Name="D" };
Employee E = new Employee(){ Name="E" };
Employee F = new Employee(){ Name="F" };
Employee G = new Employee(){ Name="G" };
A.Referred.Add(B);
B.Referred.Add(C);
B.Referred.Add(D);
D.Referred.Add(E);
F.Referred.Add(G);
List<Employee> employees = new List<Employee>()
{
A, B, C, D, E, F, G
};
foreach (var emp in employees)
{
if (!emp.BeenCounted) countRefers(emp);
}
}
private static int countRefers(Employee emp)
{
if (!emp.BeenCounted && emp.Referred.Count != 0)
{
foreach (var refs in emp.Referred)
{
emp.CountOfRefer += countRefers(refs);
}
}
emp.BeenCounted = true;
emp.CountOfRefer += emp.Referred.Count;
return emp.CountOfRefer;
}
基本的に、従業員をカウントするとき、参照していない人が見つかるまでツリーを再帰します (人々はお互いを参照できないため、そこにいることが保証されるべきです (今のところそのケースを無視して、1人しかいない場合を除きます) )))。次に、再帰を通じて誰かを計算する必要がある場合は、フラグを設定して、再度計算する必要がないようにします。