できたポ。
namespace Wankuma {
using System.Collections.Generic;
// 有向グラフのあたま
public class BeginPoint {
public delegate void action(List<string> s, int w);
private event action next;
public void Connect(Activity a) { next += a.evaluate; }
public void Start() {
next(new List<string>(), 0);
}
}
// アクティビティ
public class Activity {
private int weight_;
private string name_;
public delegate void action(List<string> s, int w);
private event action next;
public Activity(string n, int w) { name_ = n; weight_ = w; }
public void Connect(Activity a) { next += a.evaluate; }
public virtual void evaluate(List<string> s, int w) {
s.Add(ToString());
next(s, w + weight_);
}
public override string ToString() {
return string.Format("{0}({1})", name_, weight_);
}
}
// 有向グラフのおしり
public class EndPoint : Activity {
private SortedList<int,List<string>> result_ =
new SortedList<int,List<string>>();
public EndPoint() : base("",0) {}
public override void evaluate(List<string> s, int w) {
// 経路の短い順に保存
result_.Add(w, new List<string>(s));
s.Clear();
}
// 結果出力
public void Report() {
foreach ( KeyValuePair<int,List<string>> item in result_ ) {
foreach ( string str in item.Value ) { System.Console.Write("{0}→",str); }
System.Console.WriteLine(item.Key);
}
result_.Clear();
}
}
// おためし
public class Program {
public static void Main() {
BeginPoint begin = new BeginPoint();
Activity a1 = new Activity("ごはんたき",40);
Activity a2 = new Activity("ちゃーはん",10);
Activity a3 = new Activity("ぎょーざ", 45);
EndPoint end = new EndPoint();
begin.Connect(a1);
begin.Connect(a3);
a1.Connect(a2);
a3.Connect(a2);
a2.Connect(end);
begin.Start();
end.Report();
}
}
}