pat 1154 Vertex colorear (simple simulación de la figura).

1154 Vertex Coloring (25 分)

Una coloración vértice adecuada es un etiquetado de los vértices del gráfico con colores tales que no hay dos vértices que comparten el mismo borde tienen el mismo color. Una coloración utilizando en la mayoría de los colores k se llama un (adecuado) k-coloración.

Ahora se supone que para decir si una coloración dada es una k-coloración adecuada.
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 aristas, 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 colorantes que se supone que comprobar. Entonces k líneas siguen, cada uno contiene N colores que están representados por números enteros no negativos en el rango de int. El i-ésimo color es el color de la i-ésima vértice.
Especificación de la salida:

Para cada colorear, imprimir en una línea k-colorear si es un k-colorear para algunos k positiva adecuada, o No si no.
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
4
0 1 0 1 4 1 0 1 3 0
0 1 0 1 4 1 0 1 0 0
8 1 0 1 4 1 0 5 3 0
1 2 3 4 5 6 7 8 8 9

pensamiento

Este problema es que cada punto tiene un color diferente, que Italia necesita encontrar una estructura especial para cumplir con los lados adyacentes del mismo color no puede, si este es el caso, la salida a continuación, esta cifra el número de colores que hay una estructura, si los lados adyacentes del
mismo color, no hay salida de
este problema fácilmente tiempo de espera de matriz de adyacencia, así que en vez de adyacencia tabla
directamente adyacente al punto se determina para cada punto de una vez, si la presencia de las mismas salidas punto de color no

código

#include<bits/stdc++.h>
using namespace std;
const int maxsize = 1e4 + 5;
//int edge[maxsize][maxsize];
vector<vector<int> > edge;
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    edge.resize(n + 1);
    int from, to;
    for(int i = 0; i < m; i++) {
        scanf("%d%d", &from, &to);
        edge[from].push_back(to);
        edge[to].push_back(from);
    }
    int k, color[n];
    scanf("%d", &k);
    set<int> s;
    while(k--) {
        s.clear();
        for(int i = 0; i < n; i++) {
            scanf("%d", &color[i]);
            s.insert(color[i]);
        }
        bool isColor = true;
        for(int i = 0; i < n && isColor; i++) {
            for(int j = 0; j < edge[i].size(); j++) {
                if(color[i] == color[edge[i][j]]) {
                    isColor = false;
                }
            }
        }
        if(isColor)
            printf("%d-coloring\n", s.size());
        else
            printf("No\n");
    }
    return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/csyxdh/p/12483945.html
Recomendado
Clasificación