1134 Vertex Cover (25 puntos) cuestión de tiempo de espera

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.

 

Supongo que te gusta

Origin www.cnblogs.com/zzlback/p/12635956.html
Recomendado
Clasificación