Explorar: "Cómo juzgar si un punto en el gráfico está en el bucle"

Antes de desencadenar este pensamiento, primero presentamos un tema:

Tema: Falta el laberinto

Descripción del título

 Geralt cayó accidentalmente en el laberinto cuando estaba dividiendo sus tropas con Hiri y persiguiendo la caza de peces salvajes, pero ¿cómo podría ocultar la sabiduría de Geralt?
    Geralt obtuvo la conectividad entre los dos extremos de cada punto del canal utilizando la excelente capacidad de percepción del cazador de demonios, y aprendió que tenía un punto inicial. Si el canal vinculado genera un bucle, es una exploración fallida (lo convertirá en original Círculo de tierra)
    Dado un número n indica el número de
    bordes conectados y luego dados n conjuntos de bordes conectados y una posición inicial
    , determine si la ruta de Geralt causará un bucle

De entrada

Entrada de datos multigrupo Entrada de la
    primera línea uno n
    Siguiente n líneas Dos números en cada línea indican puntos interconectados
    Luego ingrese una p para indicar la posición inicial
    n <100

Salida

 Sí, significa que puede abandonar el laberinto. No, significa que no puede abandonar el laberinto.

Entrada de muestra

4 
1 2 
2 3 
3 1 
3 4 
1
4 
1 2 
2 3 
3 1 
3 4 
4

Salida de muestra

No
Yes

Enlace del título: Falta el laberinto por error (presentable)

En pocas palabras, el propósito de esta pregunta es determinar si un punto está en el bucle,

Tenga en cuenta que no es para juzgar si el gráfico tiene un anillo . Tanto Case1 como Case2 tienen un gráfico de anillo, pero 1 está en el anillo y 4 no está en el anillo, por lo que Case1 se perderá y Case2 no se perderá.

Pensando uno: con respecto al bucle de gráficos, lo más fácil que pensamos es la idea de verificar y recopilar , que es lo que a menudo llamamos la matriz de encontrar padres. Es ampliamente utilizado en el clásico algoritmo de árbol de expansión mínima Kruskal (para este punto de conocimiento, ver: Proyecto desbloqueado-Kruskal-Minimal Spanning Tree ), los dos puntos finales de un borde buscan padre y padre, encuentran sus antepasados, si es el mismo antepasado, entonces este borde debe constituir un bucle. Pero el autor piensa que esto no es aplicable, porque tenemos que saber si cierto punto está en el circuito.

Pensamiento dos: podemos tener otra idea. Solo tenemos que atravesar este gráfico. Es bueno comenzar desde el punto solicitado y buscar profundamente en el gráfico. Si regresamos después de una vuelta, este punto está en el bucle. El ideal está muy lleno, la realidad es muy delgada. En la búsqueda profunda, lo marcaremos como un estado visitado cuando lleguemos a este punto, y ya no lo visitaremos.

Idea tres: como se muestra en la figura a continuación, atravesamos + rastreamos esta figura, pero marcamos el acceso a [borde], se puede acceder al punto repetidamente, si vamos a un punto, se ha visitado el borde de su punto de conexión, Significa que caminamos alrededor del bucle y volvimos a él, luego entramos en el bucle.

La implementación es la siguiente:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 100 + 10;
int vis[maxn][maxn]; //记录边的访问 ,这是关键  
int map[maxn][maxn]; //无向图,map[i][j]==1代表ij之间有边 
int n,m,flag;
void DFS(int t){
	for(int i=1;i<=n+1;i++){
		if(map[t][i]==1 && vis[t][i]==1){ //走到一个点,它的连接点的边已经访问过了,说明走了一圈环路又回到了它 
			flag=0;
			return ;
		}
		if(map[t][i]==1 && vis[t][i]==0){
			vis[t][i]=1;
			DFS(i);
			vis[t][i]=0;
		}
	}
}
int main(){
	while(cin>>n){
		memset(vis,0,sizeof(vis));
		memset(map,0,sizeof(map));
		flag=1;
		int a,b;
		for(int i=0;i<n;i++){
			cin>>a>>b;
			map[a][b]=1;
		}
		cin>>m;
		DFS(m);
		printf("%s\n",flag?"Yes":"No"); 
	}
} 

 

Publicó 20 artículos originales · ganó 15 · vistas 216

Supongo que te gusta

Origin blog.csdn.net/qq_37414463/article/details/105394065
Recomendado
Clasificación