private void RunBfs()
        {
            algo = new ParallelBreadthFirstSearchAlgorithm <int, Edge <int>, int>(g);
            try
            {
                algo.InitializeVertex += new VertexEventHandler <int>(this.InitializeVertex);
                algo.DiscoverVertex   += new ParallelVertexEventHandler <int, int>(this.DiscoverVertex);
                algo.ExamineVertex    += new ParallelVertexEventHandler <int, int>(this.ExamineVertex);
                algo.TreeEdge         += new ParallelEdgeAction <int, Edge <int>, int>(this.TreeEdge);
                algo.NextLevel        += new EventHandler(algo_NextLevel);
                algo.FinishVertex     += new ParallelVertexEventHandler <int, int>(this.FinishVertex);

                parents.Clear();
                distances.Clear();
                currentDistance = 0;

                foreach (int v in g.Vertices)
                {
                    distances[v] = int.MaxValue;
                    parents[v]   = v;
                }
                distances[sourceVertex] = 0;
                algo.Compute(sourceVertex);

                this.CheckBfs();
            }
            finally
            {
                algo.InitializeVertex -= new VertexEventHandler <int>(this.InitializeVertex);
                algo.DiscoverVertex   -= new ParallelVertexEventHandler <int, int>(this.DiscoverVertex);
                algo.ExamineVertex    -= new ParallelVertexEventHandler <int, int>(this.ExamineVertex);
                algo.TreeEdge         -= new ParallelEdgeAction <int, Edge <int>, int>(this.TreeEdge);
                algo.FinishVertex     -= new ParallelVertexEventHandler <int, int>(this.FinishVertex);
            }
        }
 public void Init()
 {
     this.parents         = new Dictionary <int, int>();
     this.distances       = new Dictionary <int, int>();
     this.currentDistance = 0;
     this.algo            = null;
     this.g = null;
 }