Caso 6-1.4 Explorando el laberinto subterráneo (30 puntos) Implementación no recursiva de DFS

Idea: Primero inserte el primer nodo en la pila y luego ingrese al ciclo. Verifique si el primer nodo de la pila tiene nodos adyacentes no visitados, si los hay, busque el más pequeño entre ellos, visítelo y empújelo en la pila hasta que un nodo no tenga nodos adyacentes no visitados, luego elimine este. Saque los nodos vecinos no visitados y luego regrese al elemento superior de la pila para verificar si hay vecinos no visitados en el elemento superior de la pila. Si hay vecinos no visitados, baje, y si no, continúe retrocediendo. (Con el siguiente código (función Non_DFS ()), será más fácil entender las ideas)

el código se muestra a continuación:

#include<stdio.h>
#include<stack>
using namespace std;
#define MAXVERTEXNUM 1001
typedef int Vertex;
int G[MAXVERTEXNUM][MAXVERTEXNUM];
bool Visited[MAXVERTEXNUM];
int Output[10000];
void Non_DFS(Vertex V, int VertexNum,int &count)
{
	stack<int> s;
	Visited[V] = true;
	s.push(V);
	int i;
	int W;  count=0; Output[count] = V; count++;
	while(!s.empty())
	{
		for(W=1; W<=VertexNum; W++)
		{
			if(G[V][W]==1&&Visited[W]==false)
				break;
		}
		if(W<=VertexNum)
		{
			s.push(W); Visited[W]=true; V = W; Output[count]=V;count++;
		}
		else
		{
			s.pop(); 
			if(!s.empty())
			{
				V = s.top(); Output[count] = V; count++;
			}
		}
	}
}
int main()
{
	int N,M,S;
	scanf("%d %d %d",&N,&M,&S);
	int i;
	Vertex V1,V2;
	int V,W;
	int count;
	for(V=0;V<MAXVERTEXNUM;V++)
		for(W=0;W<MAXVERTEXNUM;W++)
			G[V][W]=0; 
	for(i=0; i<M; i++)
	{
		scanf("%d %d",&V1,&V2);
		G[V1][V2] = 1;
		G[V2][V1] = 1;
 	}
 	for(i=0; i<MAXVERTEXNUM; i++)
 		Visited[i] = false;
 	Non_DFS(S,N,count);
 	for(i=0; i<count-1; i++)
 		printf("%d ",Output[i]);
 	printf("%d",Output[count-1]);
 	for(i=1; i<=N; i++)
 	{
 		if(Visited[i] == false) {printf(" 0"); break;}
 	}
 	return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/yiwaite/article/details/100115804
Recomendado
Clasificación