競技プログラミング用のSortedDictionaryとQueueを使った平易な実装。キーの重複が可能で、キーが同一のものはFIFO(先入れ先出し)になります。確認はしていないけれど挿入と取り出しがO(log n)で出来るはずです。IEnumerableコードが長くなるので面倒なので実装していません。
// キーの重複がOKな優先度付きキュー
public class PriorityQueue<TKey, TValue>
{
SortedDictionary<TKey, Queue<TValue>> dict = new SortedDictionary<TKey, Queue<TValue>>();
int count = 0;
public int Count
{
get
{
return count;
}
}
public void Add(TKey key, TValue value)
{
if (!dict.ContainsKey(key))
{
dict[key] = new Queue<TValue>();
}
dict[key].Enqueue(value);
count++;
}
public KeyValuePair<TKey, TValue> Dequeue()
{
var queue = dict.First();
if (queue.Value.Count <= 1)
{
dict.Remove(queue.Key);
}
count--;
return new KeyValuePair<TKey, TValue>(queue.Key, queue.Value.Dequeue());
}
}
使い方:
var p = new PriorityQueue<int, int>();
while (p.Count != 0)
{
var kvpair = p.Dequeue();
Console.WriteLine(kvpair.Key + ", " + kvpair.Value);
...
p.Add(key, value);
}