详细题目见链接:https://pintia.cn/problem-sets/15/problems/861
这道题考拓扑排序的有向无环图,很基础的一道题目,拓扑排序简单来说就是“每次删除入度为0的结点并输出之”,下面是用栈实现的一种方法
#include <iostream>
using namespace std;
int n; //结点个数
const int MAXSIZE = 110;
int indegree[MAXSIZE]; //入度
int s[MAXSIZE]; //栈的辅助数组
int g[MAXSIZE][MAXSIZE];
int main()
{
cin >> n; //输入顶点个数
//输入信息
//注意题目中的结点是从1开始的
for (int i = 1; i <= n; i++)
{
int temp;
cin >> temp;
//输入的第一个数字就是入度
indegree[i] = temp;
if (temp == 0)
continue;
//根据前驱结点复原图的信息
while (temp--)
{
int t;
cin >> t;
g[t][i] = 1;
}
}
//用栈实现拓扑序的操作
int top = 0;
int count = 0; //记录输出顶点的个数
for (int i = 1; i <= n; i++)
{
if (indegree[i] == 0)
{
s[top++] = i; //入栈
}
}
while (top)
{
int i = s[--top];
//如果有必要输出拓扑序的话,在此处输出
cout << i << " ";
count++;
for (int j = 1; j <= n; j++)
{
if (g[i][j] == 1)
{
indegree[j]--;
if (indegree[j] == 0)
{
s[top++] = j; //新结点入栈
}
}
}
}
if (count < n)
cout << "0";
else
cout << "1";
return 0;
}