Encuentre el componente de conexión fuerte del gráfico dirigido y el resumen de aprendizaje del algoritmo tarjan

¿Qué es un componente de conexión fuerte?

En un gráfico dirigido:

1. Si dos puntos se pueden conectar entre sí a través de un borde dirigido, entonces los dos puntos se denominan conexión fuerte ;

2. Si dos puntos cualesquiera en el gráfico están fuertemente conectados, entonces el gráfico dirigido se llama gráfico fuertemente conectado (un punto también es un gráfico fuertemente conectado);

3. Un subgráfico muy grande de conexión fuerte en un gráfico de conexión fuerte no (no incluido en otro subgráfico de conexión fuerte más grande) se denomina componente de conexión fuerte de este gráfico .

Como se muestra en la figura:

Los componentes fuertemente conectados en el gráfico son: {1,2,4} y {3}.

Puede verse que los componentes fuertemente conectados tienen varias características obvias:

1. No habrá puntos repetidos en cada componente fuertemente conectado.

2. En un componente fuertemente conectado, cualquier punto u puede pasar por todos los puntos a través del borde dirigido y finalmente regresar al punto u.

Que es tarjan

De las conclusiones anteriores, se puede ver que el componente fuertemente conectado es un anillo dirigido al máximo.

El llamado tarjan debe estar relacionado con DFS (no me preguntes por qué). Suponga que a partir del punto u DFS, si u está en un componente fuertemente conectado, definitivamente volverá al punto u al final.

La implementación específica del algoritmo tarjan es:

1. Utilice dfn [u] para registrar el número de búsqueda de u (indicando que u es el punto buscado);

2. Utilice bajo [u] para representar el punto con el número de búsqueda más pequeño que se puede buscar hacia abajo desde u, e inicialice bajo [u] como dfn [u];

3. Ponga u en la pila, y los puntos en la estación representan puntos que no han sido clasificados como componentes fuertemente conectados;

4. Enumere los puntos conectados por u, busque hacia abajo y establezca este punto como v. Si v está en la pila, es decir, v se ha buscado y no se ha clasificado como un componente fuertemente conectado, entonces bajo [u] = min (bajo [u], dfn [v]); si no se ha buscado v, entonces v no debe clasificarse como un componente fuertemente conectado, entonces DFS [v] y registro bajo [u] = min (bajo [u], bajo [v]);

5. Finalmente, si dfn [u] es igual a bajo [u], significa que buscar hacia abajo desde u volverá a u (o buscar hacia abajo desde u), porque en la pila, el punto se busca hacia abajo desde u. todos apilados en u, por lo que los puntos apilados en u en la pila se extraen de la pila con u y se clasifican como un componente fuertemente conectado.

Entre todos los puntos encontrados por u, el punto que no puede ser devuelto a u a través del borde dirigido (no puede estar fuertemente conectado a u), o está conectado a un punto v con un valor dfn mayor que u, formando un anillo pequeño , y luego saliendo de la pila ;

O el anillo no está formado, el valor bajo sigue siendo el mismo que el valor dfn, y saldrá de la pila (este es el componente de conexión fuerte de un punto),

Por lo tanto, los puntos restantes en la pila en u son todos puntos que pueden estar fuertemente conectados a u.

Por ejemplo, la imagen de arriba:

Buscar desde el punto 1:

Buscar hacia abajo de 2 a 4:

4 está conectado a 1, se encontró que 1 está en la pila, cambios bajos y retrocede a 2:

A continuación, busque de 2 a 3:

3 No se puede buscar de nuevo, dfn = low, sale de la pila:

Finalmente, volviendo a 1, encuentre que dfn = low, 1, 2 y 4 salen juntos de la pila:

Encuentre 2 componentes fuertemente conectados: {3}, {1,2,4}.

código del núcleo de tarjan

void tarjan(int x){
	dfn[x]=low[x]=IN++;
	in_s[x]=1;
	S.push(x);
	for(int i=0;i<G[x].size();i++){
		if(!dfn[G[x][i]]){
			tarjan(G[x][i]);
			low[x]=min(low[x],low[G[x][i]]);
		}
		else if(in_s[G[x][i]])low[x]=min(low[x],dfn[G[x][i]]);
	}
	if(dfn[x]==low[x]){
		num++;int v;
		do{
			v=S.top();
			S.pop();
			belong[v]=num;
			M[num]=min(M[num],mn[v]);
			in_s[v]=0;
		}while(v!=x);
	}
}

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_43960287/article/details/90715320
Recomendado
Clasificación