hdu1272 Laberinto de Xiaoxi (y conjunto de verificación + anillo de juicio)

Tema: Dados dos números, hay una ruta entre los dos números, con 0,0 como final de un conjunto de datos y -1, -1 en su conjunto, le permite juzgar si cada dos puntos Solo hay un camino.

Idea: Cada dos puntos deben estar conectados (es decir, hay una relación). A partir de esto, piense y verifique el conjunto, y use la búsqueda para encontrar el ancestro (nodo raíz) para fusionar estos puntos dados, y para satisfacer solo una ruta, Entonces no pueden aparecer bucles en este conjunto. (Una vez que aparece un bucle, significa que hay múltiples caminos entre dos puntos. Puede dibujar el suyo). Puede usar una bandera para determinar si se produce un bucle. Al buscar un ancestro (nodo raíz), dos puntos tienen el mismo ancestro (nodo raíz)).

También hay un hoyo en esta pregunta. Si hay dos o más conjuntos, debe haber dos puntos que no estén conectados. En este momento, la idea no está satisfecha. Puede usar una matriz para marcar los puntos que han aparecido, y luego ver si Todos los puntos que han aparecido tienen un solo antepasado.

. 1 #include <la iostream>
 2 #include <cstdio>
 3. #Include <CString>
 4.  El uso de  espacio de nombres STD;
 . 5  const  int MAXN = 100.006 ;
 . 6  BOOL En Flag;
 . 7  int F [MAXN];
 . 8  int VIS [MAXN];
 . 9  int find ( int v) // Y encuentra el nodo raíz 
10  {
 11      if (f [v] == v)
 12      return v;
 13      else 
14      return find (f [v]);
 15 }
 16  void merge ( int u, int v) // Merge 
17  {
 18      int t1 = find (u);
 19      int t2 = find (v);
 20      if (t1! = T2) // nodo raíz de dos puntos Diferente significa que los dos puntos pertenecen a conjuntos diferentes 
21      {
 22          f [t2] = t1;
 23      }
 24      más // Si los dos puntos ya están en el mismo conjunto (el mismo nodo raíz), significa que ya hay una manera de conectar los dos puntos Los puntos están conectados, y luego no hay coincidencia para el significado de la pregunta 
25      {
 26          flag = false ;
 27      }
 28  }
 29 int main ()
 30  {
 31      int x, y;
 32      while (~ scanf ( " % d% d " , & x, & y)) // El título requiere múltiples conjuntos de entrada. Ingrese dos números primero para corresponder al siguiente juicio especial 
33      {
 34          if (x == 0 && y == 0 ) // El juicio especial de esta pregunta, si solo se ingresa 0,0, también está en línea con los requisitos ... 
35          {
 36              printf ( " Sí \ n " );
 37              continue ; // Necesita continuar ingresando el siguiente conjunto de datos 
38          }
 39          for ( int i = 0; i <= maxn; i ++) // Cada vez que
 ingresa un nuevo conjunto de datos, debe inicializar 40          {
 41              f [i] = i; // Y verificar la inicialización 
42              vis [i] = 0 ; // Aparece la marca Pasó el punto 
43          }
 44          if (x == - 1 && y == - 1 ) // Ingrese -1, -1 termina 
45          break ;
 46          merge (x, y); // Combine dos puntos en un conjunto 
47          flag = verdadero ; // Este es un signo para juzgar si hay un bucle 
48          vis [x] = 1 ;
 49          vis [y] =1 ; // Marque los dos primeros puntos primero 
mientras 50          mientras (scanf ( " % d% d " , & x, & y), x, y)
 51          {
 52              merge (x, y); // Merge 
53              vis [ x] = 1 ; // Marque 
54              vis [y] = 1 ;
 55          }
 56          if (! flag)
 57          {
 58              printf ( " No \ n " ); // Si hay un bucle, no cumple con los requisitos 
59              continuar ;// Continuar con el siguiente conjunto de datos 
60          }
 61          más // Juzgar las otras condiciones sin el ciclo 
62          {
 63              int cnt = 0 ; // Juzgar cuántos conjuntos 
64              para ( int i = 0 ; i <= maxn; i ++ )
 65              {
 66                  if (vis [i] && f [i] == i) // Hay algunos nodos raíz en los puntos que se han (dado) hay varios conjuntos de sus propios 
67                  cnt ++ ;
 68              }
 69              if (cnt == 1 )
 70              {
 71                 printf ( " Sí \ n " ); // Cuando solo hay un conjunto, cumple con la intención 
72              }
 73              más 
74              {
 75                  printf ( " No \ n " ); // De lo contrario, no coincide 
76              }
 77          }
 78      }
 79 }

 

Supongo que te gusta

Origin www.cnblogs.com/theshorekind/p/12675419.html
Recomendado
Clasificación