public void Init()
 {
     this.parents = new Dictionary<int, int>();
     this.distances = new Dictionary<int, int>();
     this.currentDistance = 0;
     this.algo = null;
     this.g = null;
 }
        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);
            }
        }