Una cubierta de vértice de un gráfico es un conjunto de vértices de tal manera que cada borde del gráfico es incidente a al menos un vértice del conjunto. Ahora bien, dada una gráfica con varios conjuntos de vértices, se supone que para saber si cada uno de ellos es una cubierta de vértices o no.
Especificación de entrada:
Cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea da dos enteros positivos N y M (ambos no más de 1), siendo el número total de vértices y los bordes, respectivamente. Entonces M líneas siguen, cada uno describe un borde dando a los índices (de 0 a N - 1) de los dos extremos del borde.
Después de la gráfica, un número entero positivo K ( se da ≤ 100), que es el número de consultas. A continuación, las líneas K de consultas siguen, cada uno en el formato:
N v v [ 1 ] v [ 2 ] ⋯ v [ N v ]
donde N v es el número de vértices en el conjunto, y v [ i ] 's son los índices de los vértices.
Especificación de la salida:
Para cada consulta, imprimir en una línea Yes
si el conjunto es una cubierta de vértice, o No
en caso contrario.
Ejemplo de entrada:
10 11 8 7 6 8 4 5 8 4 8 1 1 2 1 4 9 8 9 1 1 0 2 4 5 4 0 3 8 4 6 6 1 7 5 4 9 3 1 8 4 2 2 8 7 9 8 7 6 5 4 2
Salida de muestra:
No si si No No
Medios propósito de esta pregunta se da un mapa, y la prueba de K, cada prueba, varios puntos de entrada, estos puntos si los bordes conectados, que comprenden todos los bordes a través de las salidas GRAPH Sí, de lo contrario, la salida n
Esta pregunta me puse a pensar si, si cada borde, almacenar su punto izquierdo, punto correcto para almacenarlo, y luego cada caso de prueba para cada punto, tiene que atravesar los dos puntos finales de cada borde, si el punto de izquierda o es este punto el punto correcto, puso añadió esta ventaja, no es una última mirada
Todos los bordes se añaden a la lista. Por desgracia, las dos últimas veces fuera de los casos de uso.
Así que la estructura I Un almacenamiento por otro, el lado con el punto de unión de cada vector guardarlo, y finalmente atravesar el punto dado, ver si contiene todos los bordes.
# include <cstdio> # include <cstdlib> # include <cstring> #include <iostream> # include <mapa> # include <set> # include <cola> #include <string> # include <math> #include <vector> # include <algoritmo> using namespace std; int n, m, k, t, niño; vector <int> v [10010]; int main () { #if ONLINE_JUDGE #más freopen ( "C: \\ Usuarios \\ zzloyxt \\ Escritorio \\ 1.txt", "r", la entrada estándar); #terminara si scanf ( "% d% d", y n, y m); int a, b; for (int i = 0; i <m; i ++) { scanf ( "% d% d", & a, y b); v [a] .push_back (i); // i-ésimo borde v [b] .push_back (i); } scanf ( "% d", & k); set <int> conjuntos; mientras que (k -) { sets.clear (); scanf ( "% d", & t); for (int i = 0; i <t; i ++) { scanf ( "% d", y niño); // Añadir borde de conexión, juego no se repetirá añadió for (int j = 0; j <v [niño] .size (); j ++) { sets.insert (v [niño] [j]); } } si (sets.size ()! = m) {// no incluyen todos los lados printf ( "n \ n"); }más{ printf ( "Sí \ n"); } } return 0; }
El último es muy rápido, 600ms dado, sólo unos 300 ms.