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 }