#include using namespace std; const int N = 30, M = N * N; int n, m; int a[1050], b[1050]; // a[i] q; bool flag = 0; for (int i = 0; i < n; i++) // 枚举每个节点,入度为零的入队列 if (in[i] == 0) q.push(i); while (q.size()) { /* 注意:此处需要优先检查是不是有环,即使检查到某个点有多个前序节点,也并不表示它应该返回2,因为此时也可能是一个环! 因为一旦检查是环,就不必再录入新的大小关系的,是一个截止的标识! 总结:判断是不是拓扑序不唯一的标准是: ① 队列节点数量等于n ② 在过程中,有2个或以上的点在队列中 如果只发现了②就着急返回拓扑序不唯一,就可能会掉入到是环的坑中! */ if (q.size() > 1) flag = 1; int u = q.front(); q.pop(); d[++dl] = u; // 按出队列的顺序来记录由小到大的关系 for (int i = h[u]; ~i; i = ne[i]) { int j = e[i]; if (--in[j] == 0) q.push(j); } } // 有环 if (dl < n) return 1; // 不确定 if (dl == n && flag) return 2; // 已确定 return 3; } int main() { // n个变量,m个不等式,也就是n 个节点,m条边 while (~scanf("%d%d", &n, &m) && n | m) { // 多组测试数据,需要初始化 // 链式前向星 memset(h, -1, sizeof h); idx = 0; // 入度数组初始化 memset(ind, 0, sizeof ind); // 输入大小关系,'A'->0,...,'Z'->25 for (int i = 1; i <= m; i++) { scanf("%s", s); // 通用格式 类似于: B