Gato gato corre hacia adelante

Tema: El gato y el gato se apresuran hacia adelante
Título: Como todos sabemos, TT es un gran amante de los gatos, tiene un gato mágico y mágico.

Un día, TT vio el juego del gato en la estación B. Hay N gatos en total, numerados 1, 2, 3, ..., N para jugar. Después del juego, el anfitrión Up clasificará a todos los gatos de adelante hacia atrás y distribuirá el pescado seco favorito. Desafortunadamente, en este momento, el equipo electrónico de TT fue golpeado por el rayo cósmico de des-inteligente, e incluso sin acceso a Internet, y, naturalmente, la ceremonia de entrega final no se vio.

Afortunadamente, el gato mágico de TT registró los resultados de cada juego. Ahora quiere programar para determinar la secuencia del orden lexicográfico más pequeño. Por favor, ayúdenlo.

Entrada:
Hay varios grupos de entradas, la primera fila en cada grupo es dos números N (1 <= N <= 500), M; donde N representa el número de gatos y gatos, M representa las siguientes M filas de datos de entrada. En las siguientes M filas de datos, cada fila también tiene dos enteros P1, P2 significa que el gato con el número P1 gana al gato con el número P2.
Salida:
dé una clasificación que cumpla con los requisitos. Hay un espacio entre los números de gatos y gatos durante la salida, ¡y no hay espacio después de la última!
Otras instrucciones: la clasificación que cumple con las condiciones puede no ser única. En este momento, el equipo con el número más pequeño debe estar en la salida; Ingrese los datos para asegurarse de que haya una clasificación que cumpla con los requisitos.

Ideas para resolver problemas: este problema es un tipo topológico típico, y luego encuentra un orden mínimo en el diccionario;

Código:

#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
struct node
{
    int next,to,w;
}e[100005];
int head[100005],n,m,tot=0,d[100005],k=0,in[100005],out[100005];
void add(int x,int y)
{
    e[++tot].to=y;
    e[tot].next=head[x];
    head[x]=tot;
    out[x]++;
    in[y]++;
}
void dfs()
{
    priority_queue<int,vector<int>,greater<int> > q;//维护一个最小堆
    for(int i=1;i<=n;i++)
    {
        if(in[i]==0)
        {
            q.push(i);
        }
    }
    while(!q.empty())//拓扑排序
    {
        int u=q.top();
        q.pop();
        d[k++]=u;
        for(int i=head[u];i;i=e[i].next)
        {
            int to=e[i].to;
            in[to]--;
            if(in[to]==0)
            {
                q.push(to);
            }
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        k=0,tot=0;
        memset(head,0,sizeof(head));
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        memset(d,0,sizeof(d));
        int p1,p2;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&p1,&p2);
            add(p1,p2);//加边
        }
        dfs();
        for(int i=0;i<k;i++)
        {
            if(i){printf(" ");}
            printf("%d",d[i]);
        }
        cout<<endl;
    }
}
PGZ
Publicado 34 artículos originales · elogiado 0 · visitas 860

Supongo que te gusta

Origin blog.csdn.net/qq_43653717/article/details/105498597
Recomendado
Clasificación