测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A36048. 课程表

填空题 较难

题目描述

课程表

题目描述

现在你总共有n门课需要选,记为0到n-1。在选修某些课程之前需要一些先修课程。例如,想要学习课程0,你需要先完成课程1,我们用一个匹配来表示他们:[0, 1]。给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?

输入

多组数据。每组数据第一行是n和m,n表示有n门课程,m表示有m组依赖关系,接下来的m行是依赖关系的具体信息a b,表示第a门课程依赖第b门课程。 0<=n <=1000,0 <= m <= 4000 两组数据之间可能有空行

输出

对每组数据,能完成输出 True,不能完成输出 False

样例输入

2 1

1 0

2 2

1 0 

0 1

样例输出

True

False

提示

示例2解释: 总共有2门课程。学习课程1之前,你需要先完成课程0;并且学习课程0之前,你还应先完成课程1。这是不可能的。

参考答案

// 拓扑排序:Kahn算法+邻接表+栈 #include <bits/stdc++.h> using namespace std; int n, m; int a[1005][1005]; // 邻接点 int rd[1005], cd[1005]; // 入度 出度 int main() { int r, c, num, i, j, k; stack<int> st; while (cin >> n >> m) { memset(a, 0, sizeof(a)); memset(rd, 0, sizeof(rd)); memset(cd, 0, sizeof(cd)); while (!st.empty()) st.pop(); for (i = 1; i <= m; i++) { cin >> r >> c; rd[c]++; cd[r]++; a[r][cd[r]] = c; } for (i = 0; i <= n - 1; i++) if (rd[i] == 0) { st.push(i); } num = 0; while (!st.empty()) { i = st.top(); st.pop(); num++; for (j = 1; j <= cd[i]; j++) { k = a[i][j]; rd[k]--; if (rd[k] == 0) st.push(k); } } if (num == n) cout << "True" << endl; else cout << "False" << endl; } return 0; }
上一题 下一题