coincidente gráfica máxima bipartito (método Hungría): números primos compañero

título Descripción

  Si ambos números enteros positivos y es un número primo, entonces los dos números enteros positivos llamados "socio prime", tales como 2 y 5, 6 y 13, que pueden ser aplicados a las comunicaciones cifradas. Ahora la contraseña que aprender a diseñar un programa a partir de N existente (N es un número par) enteros positivos escojan primer socio de varios pares", la selección de programas tan diversos como hay cuatro números enteros positivos: 2,5, 6,13, 5 y 6, si un grupo consigue solamente en un conjunto de "socio de primera", mientras que el 2 y el 5,6 y el 13 consisten obtuvieron dos "socio de primera", puede estar compuesto por "principal socio" más el programa se llama "la mejor solución", por supuesto, usted quiere averiguar la contraseña de aprender "las mejores prácticas".

entrada

  Hay un número par positivo N (N≤100), indica el número de números naturales a ser seleccionado. números específicos dados más adelante, en el rango [2,30000].

exportación

  Una salida entero K, que obtuvo "la mejor solución" que consiste en "socio primordial" de un número.

Introduzca una descripción

  1, la entrada de un número positivo incluso n
  2, n números enteros de entrada

salida Descripción

  número determinado de "mejores prácticas" componente "primer socio" de.

entrada

4
2 5 6 13

exportación

2

pensamiento

  Considere el uso de métodos de teoría de grafos para dar el modelado título. 100 100 como el número de puntos, si estos dos números juntos y es un número primo, a ambos lados de un número par de intermedio. Después de eso, queremos seleccionar tantas aristas, estos bordes no están obligados a compartir los puntos finales. Cada número está en el intervalo [2,30000]. Además del primer número 2 es par, el otro extraño - 2 ahora imposible, por lo que sólo consideran primos impares. 2 y el número es impar, + número par única impar. Por lo tanto, ponemos estos números en el reactor 2 - pares e impares, para dar un grafo bipartito. Luego, en el medio de ellos, y es un número primo, incluso en un lado, y luego hacer el juego. Para obtener la máxima coincidencia de grafo bipartito, hay una gran cantidad de la aritmética simple, algoritmo de Hungría .

conceptos relacionados

Bipartito gráfico
  bipartito gráfico es en realidad en un gráfico de todos los puntos se pueden dividir en dos grupos, el mismo grupo no tiene bordes, todas las partes han cruzado los dos grupos. Precisamente: los vértices de un gráfico se divide en dos conjuntos disjuntos U y V, y de tal manera que cada lado están conectados respectivamente a U, V de vértices, si la presencia de esta división, este llamado gráfico bipartito en la figura.
  Además hay una definición equivalente gráfico bipartito es: la figura no contiene una "lados impares contienen anillos".
Coincidencia de
  juego gráfico bipartito es un conjunto de bordes en la que dos lados hay vértice común. Definimos son:
       borde coincidente, punto de partido, igualación no borde, puntos no coincidentes.
  La figura: Si vinculado 1-2, 5-4 están conectados, está conectado a 7-6. Obviamente los bordes 1-2, 5-4 lado, para que coincida con el borde lateral 7-6, 1,2,4,5,6,7 punto de coincidencia. Los restantes no coincidentes y de borde no coincidente puntos.

coincidente máximo
  para este partido coincidente es decir, el número máximo de bordes en la figura coincide con una contenida en la fig. La cifra es la máxima adaptación como:


  Con mucho, la mayor coincidencia puede no ser único.
Un complemento perfecto para
  un partido si un gráfico, todos los vértices son el punto de partido, entonces es una combinación perfecta. La figura es una combinación perfecta. Obviamente, el complemento perfecto debe ser el partido más importante (punto de partido, ya sea perfecta se han emparejado, añadir un nuevo conflicto voluntad lateral a juego con la parte coincidente existente). Pero no todos los mapas hay una coincidencia perfecta.
Ruta alternativa
  de un punto de salida no coincide, pasa a través de la igualación no borde, igualación de bordes, camino de igualación no borde formado ...... llamada ruta alternativa. La figura 2-> 1-> 8-> 7 que es un camino alternativo.

Aumentar ruta
  desde un punto no coinciden, tomar la ruta alternativa, si no se llega a otro punto de partido, esta ruta alternativa se llama (ruta agumenting) trayectoria de aumento. La figura 1-> 2-> 3-> 6-> 7-> 8 es los caminos uno de aumento.

propiedades Aumento de Path
  definidos por el camino siguiente tres conclusiones aumentar pueden introducirse (siempre que la trayectoria de la corriente P, la coincidencia de la M actual):
  . 1, P es la longitud de la trayectoria debe ser un número impar, el primer borde lateral y la última no está M pertenece, como un conjunto de dos puntos finales pertenecen a dos, y no a juego.
  2, P se puede obtener a través de la operación inversa para que coincida con un M más grande'.
  3, M es un juego máximo de G si y sólo si aumentada con respecto a la trayectoria M no existe.

algoritmo húngaro: la búsqueda de la ruta de coincidencia máxima de aumento
  1, M se establece en NULL.
  2, para encontrar un P trayectorias de aumento, una mayor partido M 'en lugar de la operación mediante la negación de M 3, se repite hasta que el camino no se puede encontrar una amplia por hasta 2 operaciones.

Buscando aumentar algoritmo del camino
  que utilizamos el método DFS de encontrar una trayectoria de aumento, a partir de la parte X vértices uno u inigualables, busca un punto de acceso v no adyacentes (v debe ser el vértice Y). Para v, dos posibilidades:
  1, v si no coincide, han encontrado una trayectoria de aumento.
  2, si v tiene, la coincidencia se toma vértice v W (w X debe ápice), el borde (w, v) es la partida actual, de acuerdo con la idea de "invertida", a (w, v) modificado es inigualable, (u, v) se ajusta para que coincida con la condición de lograrlo es mirar si el nuevo punto de partida desde w para encontrar una trayectoria de aumento de P'. Si bien, el UV-P 'es un camino para la extensión de u origen.
Código es el siguiente

. 1 #include <la iostream>
 2 #include <CString>
 3. #Include <vector>
 4.  El uso de  espacio de nombres STD;
 . 5  const  int N = 100 , M = 60.001 ;
 . 6 Vector < int > G [N]; // bipartito figura 
. 7  int pre [N], los nums [N];   // corriente correspondiente al punto de coincidencia par-impar, el número de entradas 
. 8  BOOL la esPrimo [M], en Flag [N]; // si la tabla de correspondencia número primo, un punto de coincidencia puede ser igualada
 9  @ Euler tamiz tabla tabla se establece la correspondencia de los números primos 
10  void primeTab () {
 . 11      int prime [M], CNT =0 ;
12      Primer [cnt ++] = 2 ;
13      memset (esPrimo, verdadero , sizeof (esPrimo));
14      esPrimo [ 0 ] = esPrimo [ 1 ] = false ;
15      para ( int i = 4 ; i <M; i + = 2 )
 16          esPrimo [i] = false ;
17      para ( int i = 3 ; i <M; i + = 2 ) {
 18          si (esPrimo [i])
 19             Primer [CNT ++] = I;
 20 es          para ( int J = 0 ; J <CNT && I * Prime [J] <M; ++ J) {
 21 está              la esPrimo [I * Prime [J]] = false ;
 22 es              SI (I primer% [J] == 0 )
 23 es                  PAUSA ;
 24          }
 25      }
 26 es  }
 27  // ruta de búsqueda de aumento de la profundidad primero, para encontrar una coincidencia máxima 
28  BOOL DFS ( int n-) {
 29      para ( int I = 0 ; I < G [n-] .size (); ++ I) {
30          int X = G [n-] [I];
 31 es          SI (En Flag [X])    // Si nums [X] es nums [n] los puntos emparejados, ahora tiene que hacer 
32              Continuar ;
 33 es          En Flag [X ] = true ; // los nums [X] se convierte en nums [N] de un punto de coincidencia
 34 es          // los nums [X] no coincide || nums [x] ha sido igualada, pero puede ser permitido para buscar un punto de coincidencia de manera que el nuevo punto de Teng coincidente los nums [X] 
35          IF (pre [X] == - 1. || DFS (pre [X])) {  
 36              pre [X] = N-;    // a nums [n] coincide con los nums [X] 
37 [              retorno  a la verdadera ;
 38 es          }
 39      }
 40      de retorno en false ;
 41 es  }
 42 es  int main () {
 43 es      int n-;
 44 es      primeTab (); // build número primo tabla de correspondencia 
45      / * 
46 está      preasignado de forma predeterminada en lugar de 0 hasta -1, porque los nums pre almacenan en el impar subíndice.
47      Si el valor por defecto pre Fu 0 pre [i] 0 tiene dos significados =:
 48      pre [I] se asigna a ninguna; (2) pre mapeo [I] para nums [0] (1.).
49      contradictoria, se le asigna -1.
50      * / 
51 es      Memset (pre, - 1. , El sizeof (pre)); 
 52 es      el tiempo (CIN >> n-) {
 53 es          para ( int I = 0 ; I <n-; ++I)
 54 es              CIN >> los nums [I];
 55          para ( int I = 0 ; I <n-- 1. ; ++ I)
 56 es              para ( int J = I + 1. ; J <n-; ++ J)
 57 es                  SI ( la esPrimo [los nums [I] + los nums [J]])
 58                      los nums [I] y 1. G [I] .push_back (J): G .push_back (I) ;? [J]   // construir un método de la lista bipartita gráfica, impares un punto de coincidencia puede ser un número par de enlaces 
59          int ANS = 0 ;
 60          para ( int J = 0 ; J <n-; ++J) {
 61 es              Memset (En Bandera, a falso , el sizeof (En Flag));
 62 es              SI (DFS (J))
 63 es                  ++ ANS;
 64          }
 65          COUT ANS << << endl;
 66          para ( int I = 0 ; I < n-; i ++) {   // relación clara gráfico bipartito de mapeo 
67              G [I] .clear ();
 68          }
 69          Memset (pRE, - 1. , el sizeof (pre));    // Borrar la corriente correspondiente al punto de coincidencia de par-impar 
70      }
 71 }

Supongo que te gusta

Origin www.cnblogs.com/xiehuazhen/p/12574797.html
Recomendado
Clasificación