Unión Charles

Ejemplo es el flujo suave de la ingeniería eléctrica Cuelgue en:

http://acm.hdu.edu.cn/showproblem.php?pid=1232

En primer lugar a que en el mapa varias ciudades, estos pueblos pueden ser vistos como un punto, y luego te dicen lo que está en la carretera que une las ciudades conectadas directamente. El último que hay que resolver es el problema de conectividad de toda la imagen. Por ejemplo arbitrariamente darle dos puntos, por lo que determinar si se comunican, toda la imagen o para pedirle un número total de ramas comunicantes, es decir, están divididas en varios bloques independientes entre sí. Funciona como una pregunta clara, nos preguntamos también tenemos que reparar las carreteras que, en esencia, en busca de que hay varios componentes conectados.

Si una rama de la comunicación, que se describe en el punto de imagen están conectados entre sí, y ya no la carretera; si la comunicación es de dos ramas, a continuación, siempre que una reparación de carreteras, las dos ramas, cada uno seleccionado a partir de un punto, juntos, entonces todos los puntos están conectados entre sí; si tres ramas de comunicación, siempre y cuando bidireccional ...... entonces reparación
para el siguiente conjunto de los datos de entrada se describirán
421343
primera fila te digo, un total de 4 puntos, 2 carretera. Las siguientes dos líneas le dicen, no es el camino entre 1 y 3, no es el camino entre 4,3. Entonces toda la imagen se dividió en dos partes 2 y 1-3-4. Sólo tiene que añadir un camino, poner 2 y cualquier otro punto todos juntos, expedita proyecto se lleva a cabo, entonces la salida de este conjunto de datos es 1. Bueno, ahora que la programación de funciones, hay cientos de ciudades y pueblos, no hay manera de saber cuántos, pero puede haber circuito. Esto se puede hacer?
Yo solía no ser así, ya que con un disjuntos-set, bueno, el efecto es realmente bueno! Nuestra familia entera lo está utilizando!
Disjuntos-conjunto se compone de una matriz de tipo entero y dos funciones. pre array [] registros de lo que el líder de puntos cada punto es una función del hallazgo es encontrar, unirse a la fusión.
Aquí Insertar imagen Descripción
Aquí nos fijamos en y comprobamos los conjuntos de realización. int pre [1000]; esta matriz, cada uno de los héroes que grabó superiores Sí. Heroes de 1 o 0 número de inicio (según el significado de las preguntas puede ser), pre [15] = 3 dice que 15 héroes superiores son 3 héroes. Si un hombre son sus propios superiores, muestra que él es la cabeza, y encontrar hasta ahora. También hay un solitario facción separada, como Ouyang Feng, él es sus propios superiores. Todo el mundo reconoce sólo a sus superiores. Por ejemplo, los estudiantes Hu Qingniu saben que van a informar a la izquierda Yang. Quién Zhang Wuji eso? No sé! Para saber quién es su cabeza es sólo un nivel de chequeo.

Encontrar esta función se utiliza para encontrar la cabeza, es decir, lo suficientemente claro (algoritmo de compresión de caminos primer lugar, si, para más tarde).

int unionsearch(int root) //查找根结点
{
	int son, tmp;
	son = root;
	while(root != pre[root]) //我的上级不是掌门
		root = pre[root];
	while(son != root) //我就找他的上级,直到掌门出现
	{
		tmp = pre[son];
		pre[son] = root;
		son = tmp;
	}
	return root; //掌门驾到~~
}

Vistazo a la función de unir, que no es ni siquiera una línea entre dos puntos, de manera que todos los puntos de las dos placas anteriores en la que pueden intercambiar hasta. Es bueno que ver en el mapa, trazar una línea en la línea. Pero ahora estamos utilizando disjuntos-set para describir la situación en las artes marciales, un total de sólo en una matriz de pre [], la forma de lograrlo? Por ejemplo, lagos o, en las artes marciales Supongamos ahora la situación se ilustra en la figura. Xu Zhu olla guapo y Zhou Zhiruo MM es mis dos personajes favoritos, su último jefe son Xuanci Abad y la monja asesina, y que, obviamente, los dos campos. No quiero que luchen entre sí, a la derecha Ellos dijeron: "Ustedes dos gancho Lara, buenos amigos." Se ven en mi cara, acordada. Este consentimiento puede no importa trivial, la totalidad de Shaolin y Emei que no puede luchar. un cambio importante en tal forma que puede ser para cambiar la forma en muchos lugares? De hecho, muy simple, le dije a Xuanci Abad :. "Maestro, ¿podría poner su extinción Shitai superiores cambiado de esta manera, las dos facciones del último jefe original de todo el personal esté Shitai, que también afectó a la pelota !. ah reír de todos modos, no importa que sólo se preocupan por la estructura de la conectividad, el arte marcial interno "Xuanci una duda bien hecho:" confío en que, me convirtieron en sus manos lo que es, cómo no convertir mi protesta? "Por lo tanto, se encuentran con una guerra, es muy difícil de matar, la situación los cuales el color ah, pero ah, finalmente no será el resultado de esta guerra, ganador se lleva todo. Débil fue anexada. De todos modos, que se unió a que el efecto es el mismo, un arte marcial para convertirse en un dos. Esta función sirve para entenderlo?

void join(int root1, int root2) //虚竹和周芷若做朋友
{
	int x, y;
	x = unionsearch(root1);//我老大是玄慈
	y = unionsearch(root2);//我老大是灭绝
	if(x != y) 
		pre[x] = y; //打一仗,谁赢就当对方老大
}

Mira el algoritmo de compresión de caminos. El proceso de creación de las artes marciales es una función de dos personas se unen a dos personas conectadas entre sí, que cuando los hombres que completamente al azar. El último árbol se convertirá en lo que, no puedo predecir, la palabra Hydra matriz también es posible. Encuentra esta eficiencia será relativamente baja. La situación ideal es el supervisor directo de todos es la cabeza, de un total de estructura en dos etapas, sólo tiene que encontrar tiempo para encontrar la cabeza. Incluso si no está completamente hecho, lo mejor es tratar de cerrar. Esto produce un algoritmo de compresión de caminos.

Imagínese este escenario: Dos extraños héroes se encuentran, y quieren saber no se puede hacer una. Entonces, rápidamente llamó para preguntar a sus superiores: "¿Usted no es el jefe" Superior, dijo :. "Yo no soy así, así y así que son mis superiores, se le pregunta a la vista" hasta el final abajo a preguntar, tenía dos finales jefe son Dongchang Caogong Gong. "Vaya, resultó ser uno de nosotros, educado y cortés, los siguientes seis grupos de tres batallones harina muñeca calabaza!" "Mucho gusto, el siguiente conjunto de nueve batallones de dieciocho Hada de la flor de la cola de perro!" Felizmente beber a ir de la mano a. "Etc., etc., dos héroes por favor estancia, hay cosas que no ha terminado todavía!" Me detuvieron. "Oh, sí, tenemos que hacer compresión de caminos." Se despiertan. Harina de calabaza muñeca llamó a sus superiores de seis Líder: "Líder ah, he comprobado, en efecto, la cabeza del choque Caogong Gong no es tan buena como la que choque juntos en Caogong Gong hombres jurados, para salvar el nivel es demasiado bajo, el futuro. encontrar problemas para la cabeza. "" Bueno, tiene sentido. "harina de calabaza muñeca y luego llamó tres comandante del batallón ...... perro de la flor de la cola de hadas acaba de visitar hizo lo mismo. De esta manera, todos los personajes que aparecen en la consulta se reunieron bajo la dirección directa de Caogong Gong. Cada procesamiento de consultas se optimiza, por lo que todo el árbol de capas marciales se mantiene a un nivel relativamente bajo. códigos de compresión de ruta, pueden leer bien, no puede leer su propia mirada analógica, sólo recursiva muy simple. En resumen desempeña la función es tal significado.
Aquí Insertar imagen Descripción

Aviso: Este artículo es un artículo blogger original, siga el CC 4.0 BY-SA acuerdo de derecho de autor, reproduce, por favor adjuntar el enlace de la fuente original y esta declaración.
Este enlace: https: //blog.csdn.net/niushuai666/article/details/6662911
----------------
responsabilidad: Este artículo es RDCC blogger "deriva de ternera "el artículo original, siga el CC 4.0 del acuerdo de derechos de autor BY-SA, que se reproduce, por favor incluya el enlace de la fuente original y esta declaración.
fuente original: https: //blog.csdn.net/niushuai666/article/details/6662911

Aquí a continuación, adjuntar el código juntos para escribir su propio

#include <iostream>

using namespace std;

int father[1005];

void init(int n)
{
    for(int i = 1; i <= n; i++){//对父节点的初始化;
        father[i] = i;
    }
}

int Sroot(int node)//找到最上级的父结点;
{
    int son = node,tmp;
     while(father[node] != node){
        node = father[node];
     }
     while(son != node) //路径压缩,因为只关心上级,而不关心怎么
	{                   //所构成的路径结构,优化查找复杂度;
		tmp = father[son];
		father[son] = node;
		son = tmp;
	}
     return node;
}

int main()
{
    int n,m,node1,node2;
    while(cin>>n>>m,n){
        init(n);
        int total = n - 1;
        for(int i = 0; i < m; i++){
            cin>>node1>>node2;
            int r1 = Sroot(node1),r2 = Sroot(node2);
            if(r1 != r2){//如果不是一个最上级的父节点,则将两个最高级父节点连接;
                    father[r1] = r2;//反过来也可以;
                    total--;
            }
        }
        cout<<total<<endl;
    }
    return 0;
}

CU1
Publicado 30 artículos originales · ganado elogios 2 · Vistas 943

Supongo que te gusta

Origin blog.csdn.net/CUCUC1/article/details/105337722
Recomendado
Clasificación