PAT Clase 1134 Vertex Cover (25 puntos)

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 10 ^ 4), 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, se le da un número entero positivo K (<= 100), que es el número de consultas. A continuación, las líneas K de consultas siguen, cada uno en el formato:

NV v [1] v [2] ... v [NV]

donde Nv 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 “Sí” 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


No
No


efecto de título
tapa Un vértice es un conjunto de puntos, uno para cada lado de la gráfica son el conjunto de puntos de acceso.
Siempre pregunte a preguntar si un determinado conjunto de tapa de vértice

El análisis de
registro en el lado de entrada al lado cuando se le preguntó acerca de desplazamiento

Registro de errores :
Mientras se adentraba en el borde for (int i = 0; i < m; i ++)escrita en el malfor (int i = 0; i < n; i ++)

#include <bits/stdc++.h>
using namespace std;
int n, m;
const int maxn = 10010;
vector<int> v[maxn];
bool vis[maxn];

bool judge()
{
    int num, u;
    cin >> num;
    for (int i = 0; i < num; i ++)
    {
        cin >> u;
        for (auto x : v[u]) vis[x] = 1;
    }
    for (int i = 0; i < m; i ++)
        if (!vis[i]) return false;
    return true;
}

int main()
{
	int a, b, k;
    cin >> n >> m;
    for (int i = 0; i < m; i ++)
    {
        cin >> a >> b;
        v[a].push_back(i);
        v[b].push_back(i);
    }

    cin >> k;
    while (k --)
    {   
    	memset(vis, 0, sizeof vis);
        judge()?puts("Yes"):puts("No");
    }
    return 0;
}
Publicados 673 artículos originales · ganado elogios 644 · vistas 380 000 +

Supongo que te gusta

Origin blog.csdn.net/zhaohaibo_/article/details/90371166
Recomendado
Clasificación