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;
}