Exploración del laberinto subterráneo (30 puntos) (DFS)

La guerra de túneles fue un método de lucha contra los invasores japoneses por túneles en la llanura del norte de China durante la Guerra Antijaponesa. La red de túneles son las fortificaciones subterráneas de casas que conectan casas, calles que conectan calles y pueblos que conectan pueblos, como se muestra en la siguiente figura.

Inserte la descripción de la imagen aquí

Al revisar la ardua vida de guerra de nuestros predecesores, admiramos sinceramente su ingenio. En la era del desarrollo pacífico, para la mayoría de las personas, explorar pasajes subterráneos puede ser solo un entretenimiento o un juego de rompecabezas. Este caso experimental se basa en explorar el laberinto de pasajes subterráneos.

Supongamos que hay un laberinto de pasajes subterráneos. Sus pasajes son rectos y hay una luz y un interruptor en todas las intersecciones del pasaje (incluido el final del pasaje). ¿Cómo enciendes todas las luces del laberinto desde un punto de partida determinado y vuelves al punto de partida?

Inserte la descripción de la imagen aquí

Formato de entrada:
ingrese la primera línea para dar tres enteros positivos, que representan respectivamente el número de nodos en el laberinto subterráneo N (1 <N≤1000, lo que significa todas las intersecciones y puntos finales del pasaje), el número de bordes M ( ≤3000, que significa el número de pasajes) y Explore el número de nodo inicial S (los nodos están numerados del 1 al N). Las siguientes M filas corresponden a M bordes (canales), y cada fila da un par de números enteros positivos, que son los números de los dos nodos directamente conectados al borde.

Formato de salida:
si las luces de todos los nodos pueden encenderse, entonces genere una secuencia que contenga todos los nodos comenzando por S y terminando en S. Los nodos adyacentes en la secuencia deben tener bordes (canales); de lo contrario, las luces de todos los nodos no pueden ser iluminado., Pero aún genera la secuencia de nodos que encienden algunas luces, y finalmente genera 0, lo que significa que el laberinto no es un gráfico conectado.

Dado que la secuencia de nodos de recorrido en profundidad primero no es única, para que la salida tenga un resultado único, acordamos visitar (luz encendida) en el orden de prioridad del pequeño número de nodos. Después de encender todas las luces que se pueden encender, regrese al punto de partida volviendo al camino original

Ejemplo de entrada 1:

6 8 1
1 2
2 3
3 4
4 5
5 6
6 4
3 6
1 5
1 2 3 4 5 6 5 4 3 2 1

Ejemplo de entrada 1:

6 6 6
1 2
1 3
2 3
5 4
6 5
6 4
6 4 5 4 6 0

Idea de la pregunta:
1. El algoritmo básico de DFS es el requisito previo para esta pregunta.
2. Esta pregunta es para mejorar el algoritmo DFS, espero que podamos "volver a la carretera del parque" después de completar el recorrido DFS.
3. Los comentarios son muy detallados, puedes comentar o enviar un mensaje privado en cualquier momento si no entiendes, te responderé lo antes posible

#include<iostream>
using namespace std;

int MGraph[1005][1005] = {
    
     0 };
int Visited[1005] = {
    
     0 };
int n, m, s, a, b, count1 = 0;
bool flag = false;		 
void DFS(int index);	

int main()
{
    
    
	cin >> n >> m >> s;

	while (m--)
	{
    
    
		cin >> a >> b;
		MGraph[a][b] = MGraph[b][a] = 1;
	}

	Visited[s] = 1;		//起点访问好了,设为1
	count1 = 1;			//已经访问一个点
	DFS(s);
	if (!flag)cout << " " << 0;			//如果不是连通图就输出“ 0”;

	return 0;
}
void DFS(int index)
{
    
    
	cout << index << " ";	//打印当前访问的点
	if (count1 == n)		//当访问的点数到达n时,也就是说这是一个连通图了,
	{
    
    
		flag = true;		//既然是连通图,那么我们就吧标记做好。true还是false看个人习惯
		return;				//递归出口
	}
	
	for (int i = 1; i <= n; i++)
	{
    
    
		if (MGraph[index][i] && !Visited[i])	//如果index-i 这条边存在,并且这个节点没有被访问过
		{
    
    
			Visited[i] = 1;						//访问这个顶点
			count1++;							//访问个数增加
			DFS(i);								//从这个点继续DFS
			//根据递归是通过堆栈实现的,下面的算法就是“往回走”所经历的语句
			if (index == s)						//如果当前访问的点和一开始的起点相同,代表已经回到原点了,就不要输出额外空格了
				cout << index;
			else
				cout << index << " ";			//如果还没回到原点,那么久继续输出空格
		}
	}
	return;
}

Supongo que te gusta

Origin blog.csdn.net/xdg15294969271/article/details/114098451
Recomendado
Clasificación