エンジニアリングプロジェクトが一連のサブタスクで構成されていると仮定します。一部のサブタスクは並行して実行でき、一部は他のサブタスクの完了後にのみ実行できます。「タスクスケジューリング」には、サブタスクのセットと、各サブタスクを実行できるサブタスクのセットが含まれます。
たとえば、すべてのコースの修了と専攻の卒業デザインは、学部生が修了するプロジェクトと見なすことができ、各コースはサブタスクと見なすことができます。英語とCプログラミングなど、同時に提供できるコースもあります。どちらを先に受講するかについての制限はありません。また、2つのコースのように、連続した依存関係があるため、同時に提供できないコースもあります。 Cプログラミングとデータ構造。前者を最初に学ぶ必要があります。
ただし、サブタスクのグループの場合、任意のタスクスケジューリングではないことが実行可能なソリューションであることに注意してください。たとえば、「サブタスクAはサブタスクBに依存し、サブタスクBはサブタスクCに依存し、サブタスクCはサブタスクAに依存する」という場合、これら3つのタスクのいずれも最初に実行できません。これは実行不可能な計画です。今のあなたの仕事は、与えられたタスクのスケジューリングが実行可能かどうかを判断するプログラムを書くことです。
入力形式:
入力の説明:最初の行を入力してサブタスクの数をN(≤100)にし、サブタスクには1からNまでの番号を付けます。次のN行では、各行にサブタスクの依存関係セットが示されます。最初に、依存関係セット内のサブタスクの数Kが指定され、次にK個のサブタスク番号が指定され、整数はスペースで区切られます。
出力形式:
解決策が実行可能な場合は1を出力し、実行可能な場合は0を出力します。
質問のアイデア:有向グラフにリングがあるかどうかを判断し、トポロジカルソートします。
#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;
}