Cursos en línea CF770C en clasificación topológica BSU + dfs

Cursos en línea CF770C en clasificación topológica BSU + dfs

Enlace de asunto: https://codeforces.com/contest/770/problem/C

La idea principal del tema: Hay un total de N asignaturas, de las cuales hay M. asignaturas principales. Siempre que se superen las M asignaturas principales, el protagonista correspondiente puede graduarse, es decir, se logra la meta.
Ahora hay una lista de materias que deben aprobarse primero para aprobar el i-ésimo curso. Ahora el protagonista espera conseguir una orden para aprobar las asignaturas, para que al final pueda aprobar las menos asignaturas para que el protagonista se gradúe.
Salida: Al menos el número de cursos tomados + cualquier orden de cursos tomados, si no (hay un anillo), salida -1


Entrada de muestra :
6 2
5 3
0
0
0
2 2 1
1 4
1 5

Salida:
5
1 2 3 4 5

Idea:
primero use un vector unidimensional – ma para indicar el plato principal que necesita ser estudiado, y luego use un vector bidimensional – v para guardar la imagen. El método específico es buscar primero el plato principal, es decir, dfs (ma [i]), y luego avanzar Busque los requisitos previos del plato principal, si encuentra un nodo que se ha almacenado en la matriz de resultados (vis [i] == 2), luego regrese, si encuentra un nodo duplicado y sin resultado (vis [i] == 1) Luego, la salida -1 (hay un anillo y no puede tener éxito); de lo contrario, el nodo se coloca en la matriz de resultados.

Nota: exit (0) ------ puede finalizar directamente el programa

#include<iostream>
#include<cstdio>
#include<set>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdlib>
#include<map>
using namespace std;
#define scan(n) scanf("%d",&n)
#define ll long long
const int maxn=1e5+5;
vector<int> ma,v[maxn],r;
int n,k,m,a;
int vis[maxn];
int cnt,ff;
void dfs(int x)
{
    
    
    if(vis[x]==2)
        return;
    vis[x]=1;
    for(int i=0;i<v[x].size();i++)
    {
    
    
        int to=v[x][i];
        if(vis[to]==1)
        {
    
    
            cout<<-1<<endl;
            exit(0);
        }
        dfs(to);
    }
    vis[x]=2;
    r.push_back(x);
}

int main()
{
    
    
    scanf("%d%d",&n,&k);
    memset(vis,0,sizeof(vis));
    for(int i=0;i<k;i++)
    {
    
    
        scanf("%d",&a);
        ma.push_back(a);
    }
    for(int i=1;i<=n;i++)
    {
    
    
        scanf("%d",&m);
        for(int j=0;j<m;j++)
        {
    
    
            scanf("%d",&a);
            v[i].push_back(a);
        }
    }
    for(int i=0;i<ma.size();i++)
    {
    
    
        dfs(ma[i]);
    }
    int l=r.size();
    cout<<l<<endl;
    for(int i=0;i<l-1;i++)
        cout<<r[i]<<' ';
    cout<<r[l-1]<<endl;
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_40534166/article/details/98784054
Recomendado
Clasificación