P3243 [HNOI2015] Cocinar platos (pensamiento + clasificación topológica + gráfico inverso)

Descripción del tema
Un conocido gourmet es invitado al hotel ATM para evaluar platos para él. El hotel ATM ha preparado nn platos para el Sr. A. El hotel asigna números del 11 al nn según la calidad estimada de los platos, y el número de platos con la calidad estimada más alta es 11.

Debido al problema de combinación de sabores entre platos, algunos platos deben prepararse antes que otros. Específicamente, hay un total de m restricciones, por lo que el plato i debe prepararse antes del plato jj. Abreviaremos tales restricciones como (i,j). (i,j).

Ahora, el hotel espera encontrar un orden óptimo de cocción de los platos, para que el pequeño A pueda intentar comer platos de alta calidad primero:

Es decir,

Bajo la premisa de satisfacer todas las limitaciones, el plato número 1 debe prepararse primero en la medida de lo posible.

Bajo la premisa de que se satisfacen todas las restricciones y el plato número 1 se prepara tanto como sea posible, el plato número 2 se prepara tanto como sea posible.

Bajo la premisa de que se satisfacen todas las limitaciones y se priorizan al máximo los platos 1 y 2, el plato 3 debe prepararse lo más posible.

Bajo la premisa de que se cumplen todas las limitaciones y se priorizan al máximo los platos nº 1, nº 2 y nº 3, el plato nº 4 se debe preparar al máximo.

etcétera.

Ejemplo 1: Un total de 4 platos, dos restricciones (3,1), (4,1), entonces la secuencia de producción es 3,4,1,2.

Ejemplo 2: Hay 5 platos en total, dos restricciones (5,2), (4,3), entonces la secuencia de producción es 1,5,2,4,3.

En el ejemplo 1, considere 1 primero, porque existen restricciones (3,1) y (4,1), por lo que 1 solo se puede hacer después de hacer 3 y 4, y de acuerdo con el número 3, se le debe dar prioridad sobre 44, por lo que actualmente es posible Determinar que la secuencia de producción de los primeros tres platos es 3,4,13,4,1; luego considere 22, y determine que la secuencia de producción final es 3,4,1,23,4, 1,2.

En el ejemplo 2, no va en contra de la restricción hacer 1 primero; luego hay una restricción (5,2) al considerar 2, así que primero haga 5 y luego haga 2; luego, al considerar 33, está (4,3 )(4,3), así que primero haga 44 y luego haga 33, por lo que la secuencia final es 1,5,2,4,31,5,2,4,3. Ahora necesitas averiguar el orden óptimo de preparación de los platos. No hay salida de solución ¡Imposible! (la primera letra está en mayúscula, el resto de las letras en minúscula)

Formato de entrada
La primera línea es un número entero positivo t, que indica el número de conjuntos de datos. El siguiente es el grupo t de datos. Para cada conjunto de datos: la primera línea contiene dos números enteros positivos n y mm separados por espacios, que representan respectivamente el número de platos y el número de entradas restringidas por la secuencia de producción. La siguiente línea de mm, cada línea contiene dos números enteros positivos x, yx, y, lo que indica la limitación de que el plato xx debe realizarse antes del plato yy.

Formato de salida
El archivo de salida solo contiene t líneas, cada línea contiene n números enteros, lo que significa la secuencia de cocción óptima, o ¡Imposible! significa que no hay solución.

Entrada Salida Muestra Entrada
#1 Copia
3
5 4 5
4 5
3 4 2 3 2 3 3 1 2 2 3 3 1 5 2 5 2 4 3 Salida #1 Copia 1 5 3 4 2  ¡Imposible 1 5 2 4 3












Analizar gramaticalmente:

La secuencia óptima no es el orden lexicográfico más pequeño. Queda una tercera muestra por conocer.

Si se utiliza un pequeño montón de raíces para mantener la topología, obviamente no funcionará, porque el orden topológico obtenido de esta manera es el orden lexicográfico más pequeño y no es necesariamente que 1 deba ser el primero en la medida de lo posible.

Debido a que el orden lexicográfico es codicioso, si el anterior puede ser pequeño, debe ser lo más pequeño posible y no hay garantía de que 1 aparezca lo antes posible.

Pero si construyes un gráfico inverso y encuentras un orden topológico con el orden lexicográfico inverso más grande

Entonces habrá una situación en la que el número grande está lo más cerca posible del frente, por lo que el número pequeño está lo más cerca posible de la parte posterior, por lo que, a su vez, el número pequeño está lo más cerca posible del frente.

Así que simplemente construye el mapa al revés + un gran montón de raíces para mantenimiento.

#include<bits/stdc++.h>
using namespace std;
const int MAX = 100010;
struct edge {
    int v, next;
}e[MAX];
int d, n, m, in[MAX], cnt, head[MAX], a[MAX];
priority_queue<int> q; //默认大根堆
inline int read() {
    int x = 0, f = 1;
    char c = getchar();
    while (c < '0' || c>'9') {
        if (c == '-') {
            f = -1;
        }
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        x = (x << 1) + (x << 3) + c - '0';
        c = getchar();
    }
    return x * f;
}
void add(int u, int v) {
    e[++cnt].v = v;
    e[cnt].next = head[u];
    head[u] = cnt;
}
int bfs() {
    while (!q.empty()) {
        int p = q.top();
        q.pop();
        cnt++;
        a[cnt] = p;
        for (int i = head[p]; i > 0; i = e[i].next) {
            int v = e[i].v;
            in[v]--;
            if (!in[v]) {
                q.push(v);
            }
        }
    }
    return cnt == n;//没有环
}
int main() {
    d = read();
    while (d--) {
        memset(in, 0, sizeof(in));
        memset(head, 0, sizeof(head));
        cnt = 0;
        n = read(), m = read();
        for (int i = 1; i <= m; i++) {
            int x, y;
            x = read(), y = read();
            add(y, x); // 反向边
            in[x]++;
        }
        for (int i = 1; i <= n; i++) {
            if (!in[i]) {
                q.push(i);
            }
        }
        cnt = 0;
        if (bfs()) {
            for (int i = n; i >= 1; i--) {
                printf("%d ", a[i]);
            }
            printf("\n");
        }
        else {
            printf("Impossible!\n");
        }
    }
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/zhi6fui/article/details/129648937
Recomendado
Clasificación