Razonabilidad de la programación de tareas (25 puntos) (clasificación topológica)

Suponga que un proyecto de ingeniería consta de un conjunto de subtareas. Algunas de las subtareas se pueden ejecutar en paralelo y otras solo se pueden ejecutar después de completar otras subtareas. La "programación de tareas" incluye un conjunto de subtareas y el conjunto de subtareas en las que se puede ejecutar cada subtarea.

Por ejemplo, la finalización de todos los cursos y el diseño de graduación de una especialización se puede considerar como un proyecto que debe completar un estudiante universitario, y cada curso se puede considerar como una subtarea. Algunos cursos se pueden ofrecer al mismo tiempo, como la programación de inglés y C, no tienen restricción sobre cuál se debe tomar primero; algunos cursos no se pueden ofrecer al mismo tiempo porque tienen una dependencia secuencial, como dos cursos de Programación y estructura de datos en C. Lo primero debe aprenderse primero.

Pero debe tenerse en cuenta que para un grupo de subtareas, la programación de tareas no arbitraria es una solución viable. Por ejemplo, hay "la subtarea A depende de la subtarea B, la subtarea B depende de la subtarea C y la subtarea C depende de la subtarea A", entonces ninguna de estas tres tareas se puede ejecutar primero, lo cual es un Plan inviable. Su trabajo ahora es escribir un programa para determinar si una programación de tareas determinada es factible.

Formato de entrada:
Descripción de entrada: Introduzca la primera línea para dar el número de subtareas N (≤100), y las subtareas se numeran de 1 a N. Las siguientes N líneas, cada línea da un conjunto de dependencias de una subtarea: primero, se da el número de subtareas K en el conjunto de dependencias, y luego se dan K números de subtareas y los números enteros están separados por espacios.

Formato de salida:
si la solución es factible, salida 1; de lo contrario, salida 0.

Ejemplo de entrada 1:

Inserte la descripción de la imagen aquí

Idea de la pregunta: Determine si hay un anillo en un gráfico dirigido y ordene topológicamente.

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
vector<int> Graph[105];
int n;
int inDegree[105] = {
    
    0};
int main()
{
    
    
	cin >> n;
	int k,t;
	
	for (int i = 1; i <= n; i++)
	{
    
    
		cin >> k;
		while (k--)
		{
    
    
			cin >> t;
			Graph[i].push_back(t);
			inDegree[t]++;
		}
	}
	queue<int> que;

	for (int i = 1; i <= n; i++)
		if (!inDegree[i])
			que.push(i);
	int cnt = 0;
	while (!que.empty())
	{
    
    
		int u = que.front();
		que.pop();
		for (int i = 0; i < Graph[u].size(); i++)
		{
    
    
			int v = Graph[u][i];
			inDegree[v]--;
			if (!inDegree[v])
				que.push(v);
		}
		cnt++;
	}

	if (cnt == n)
		cout << 1 << endl;
	else
		cout << 0 << endl;


	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/xdg15294969271/article/details/114294944
Recomendado
Clasificación