You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
2.9 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <bits/stdc++.h>
// Floyd解决传送闭包问题
using namespace std;
const int N = 27;
int n; // n个变量
int m; // m个不等式
int f[N][N]; // 传递闭包结果
void floyd() {
for (int k = 0; k < n; k++)
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
f[i][j] |= f[i][k] & f[k][j]; // i可以到达k,k可以到达j,那么i可以到达j
}
// 1:可以确定两两之间的关系,2:矛盾,3:不能确定两两之间的关系
int check() {
// 如果i<i那么就是出现了矛盾
for (int i = 0; i < n; i++)
if (f[i][i]) return 2;
// 存在还没有识别出关系的两个点i,j,还要继续读入
for (int i = 0; i < n; i++)
for (int j = 0; j < i; j++)
if (!f[i][j] && !f[j][i]) return 3;
return 1;
}
string getorder() { // 升序输出所有变量
char s[26];
for (int i = 0; i < n; i++) {
int cnt = 0;
// f[i][j] = 1表示i可以到达j (i< j)
for (int j = 0; j < n; j++) cnt += f[i][j]; // 比i大的有多少个
// 举个栗子i=0,表示字符A
// 比如比i大的有5个共6个字符ABCDEF
// n - cnt - 1 = 6-5-1 = 0,也就是A放在第一个输出的位置上, 之所以再-1是因为下标从0开始
s[n - cnt - 1] = i + 'A';
}
// 转s字符数组为字符串
return string(s, s + n);
}
int main() {
// n个变量,m个不等式
// 当输入一行 0 0 时,表示输入终止
while (scanf("%d %d", &n, &m), n && m) {
string S;
int k = 3; // 3:不能确定两两之间的关系
memset(f, 0, sizeof f); // 初始化邻接矩阵
// m条边
for (int i = 1; i <= m; i++) {
cin >> S;
// 已确定或者出现了矛盾,就没有必要再处理了,但是,还需要耐心的读取完毕,因为可能还有下一轮,不读入完耽误下一轮
if (k < 3) continue;
// 变量只可能为大写字母A~Z,映射到0~25
int a = S[0] - 'A', b = S[2] - 'A';
f[a][b] = 1; // 记录a<b
// 每输入一个关系,就计算一遍传递闭包
floyd();
// 检查一下现在的情况,是不是已经可以判定了
k = check();
if (k == 2) // 出现矛盾
printf("Inconsistency found after %d relations.\n", i);
else if (k == 1) { // 可以确定
string ans = getorder(); // 输出升序排列的所有变量
printf("Sorted sequence determined after %d relations: %s.\n", i, ans.c_str());
}
}
// 所有表达式都输入了,仍然定不下来关系
if (k == 3) printf("Sorted sequence cannot be determined.\n");
}
return 0;
}