Пример #1
0
void Graph::bfs_worker(int start, void(*process_vertex_early)(int v), 
				void(*process_vertex_late)(int v), void(*process_edge)(int v, EdgeNode *p))
{
	queue<int> q;
	int v;
	int y;
	EdgeNode *p;

	q.push(start);
	discovered[start] = TRUE;

	while(q.empty() == FALSE){
		v = q.front();
		q.pop();
		process_vertex_early(v);
		processed[v] = TRUE;
		p = this->edges[v];
		while(p){
			y = p->y;
			if(processed[y] == FALSE || this->directed)
				process_edge(v,p);
			if(discovered[y] == FALSE){
				q.push(y);
				discovered[y] = TRUE;
				parent[y] = v;
			}
			p = p->next;
		}
		process_vertex_late(v);
	}
}
Пример #2
0
dfs(graph *g, int v)
{
	int i;				/* counter */
	int y;				/* successor vertex */

	if (finished) return;		/* allow for search termination */

	discovered[v] = TRUE;
	process_vertex_early(v);

	for (i=0; i<g->degree[v]; i++) {
		y = g->edges[v][i];
		if (valid_edge(g->edges[v][i]) == TRUE) {
			if (discovered[y] == FALSE) {
				parent[y] = v;
				dfs(g,y);
			} else 
				if (processed[y] == FALSE)
					process_edge(v,y);
		}
		if (finished) return;
	}

	process_vertex_late(v);
	processed[v] = TRUE;
}
Пример #3
0
bfs(graph *g, int start)
{
	queue q;			/* queue of vertices to visit */
	int v;				/* current vertex */
	int i;				/* counter */

	init_queue(&q);
	enqueue(&q,start);
	discovered[start] = TRUE;

	while (empty(&q) == FALSE) {
		v = dequeue(&q);
		process_vertex_early(v);
		processed[v] = TRUE;
		for (i=0; i<g->degree[v]; i++) 
		    if (valid_edge(g->edges[v][i]) == TRUE) {
			if (discovered[g->edges[v][i]] == FALSE) {
				enqueue(&q,g->edges[v][i]);
				discovered[g->edges[v][i]] = TRUE;
				parent[g->edges[v][i]] = v;
			}
			if (processed[g->edges[v][i]] == FALSE) 
				process_edge(v,g->edges[v][i]);
		    }
		process_vertex_late(v);
	}
}
Пример #4
0
void dfs(Graph &g, int v)
{
    std::vector<EdgeNodePtr> nextEdge(g.vc+1);
    std::vector<VStatus> vs(g.vc+1);
    std::stack<int> s;
    
    s.push(v);
    vs[v] = DIS;
    process_vertex_early(v);
    nextEdge[v] = g.eNs[v];
    
    while (!s.empty()) {
        int x = s.top();
        
        EdgeNodePtr yp = nextEdge[x];
        
        if (yp) {
            int y = yp->y;
            nextEdge[x] = yp->next;
            
            bool newEdge = false;
            if(vs[y] == UND) {
                nextEdge[y] = g.eNs[y];
                s.push(y);
                vs[y] = DIS;
                process_vertex_early(y);

            }
            
            if (vs[y] != PRO || g.directed) {
                process_edge(x, y);
            }
        } else {
            s.pop();
            process_vertex_late(x);
            vs[x] = PRO;
        }
    }
}
void bfs(graph *g, int start)
{
    queue q;

    init_queue(&q);

    enqueue(&q, start);
    discovered[start] = true;

    while (empty_queue(&q) == false)
    {
        int v = dequeue(&q);
        process_vertex_early(v);
        processed[v] = true;

        edgenode *p = g->edges[v];
        while (p != NULL)
        {
            int y = p->y;

            if (valid_edge(p))
            {
                if ((!processed[y]) || g->directed)
                {
                    process_edge(v, y);
                }

                if (!discovered[y])
                {
                    enqueue(&q, y);
                    discovered[y] = true;
                    parent[y] = v;
                }
            }

            p = p->next;
        }

        process_vertex_late(v);
    }
}
Пример #6
0
void BreadthFirstSearch::bfs(Graph *g, int start) {

    Queue q;
    int current_v;
    int successor_v;
    edgenode *current_edges;

    q.enqueue(start);
    q.print();
    discovered[start] = true;

    while(q.queueSize() > 0) {
        current_v = q.dequeue();
        process_vertex_early(current_v);
        processed[current_v] = true;

        current_edges = g->edges[current_v];

        while(current_edges != nullptr) {
           successor_v = current_edges->y;

            if((!processed[successor_v])) {
                process_edge(current_v, successor_v);
            }

            if(!discovered[successor_v]) {
                q.enqueue(successor_v);
                discovered[successor_v] = true;
                parent[successor_v] = current_v;
            }

            current_edges = current_edges->next;
        }

        process_vertex_late(current_v);
    }
}
Пример #7
0
void Graph::dfs_worker(int v, void(*process_vertex_early)(int v), 
				void(*process_vertex_late)(int v), void(*process_edge)(int v,EdgeNode *p))
{
	EdgeNode *p;
	int y;

	if(finished) return;

	discovered[v] = TRUE;

	entry_time[v] = ++time;

	process_vertex_early(v);

	p = this->edges[v];

	while(p){
		y = p->y;
		if(!discovered[y]){
			parent[y] = v;
			process_edge(v,p);
			dfs_worker(y,process_vertex_early, process_vertex_late, process_edge);
		}
		else if( (!processed[y] && parent[v] != y) || (this->directed)){
			process_edge(v,p);
		}
		if(finished) return;
		p = p->next;
	}

	process_vertex_late(v);

	exit_time[v] = ++time;

	processed[v] = TRUE;
}