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;
}