main
黄海 2 years ago
parent ec85609d58
commit 2eeb4fa09b

@ -27,20 +27,19 @@ int check() {
return 1; // 找到顺序 return 1; // 找到顺序
} }
char get_min() { string getorder() { // 升序输出所有变量
for (int i = 0; i < n; i++) char s[26];
if (!st[i]) { for (int i = 0; i < n; i++) {
bool flag = true; int cnt = 0;
for (int j = 0; j < n; j++) // f[i][j] = 1表示i可以到达j (i< j)
if (!st[j] && g[j][i]) { // 如果存在j<i的点那么i点不是最小的点 for (int j = 0; j < n; j++) cnt += g[i][j]; // 比i大的有多少个
flag = false; // 举个栗子i=0,表示字符A
break; // 比如比i大的有5个共6个字符ABCDEF
} // n - cnt - 1 = 6-5-1 = 0,也就是A放在第一个输出的位置上, 之所以再-1是因为下标从0开始
if (flag) { s[n - cnt - 1] = i + 'A';
st[i] = true;
return 'A' + i;
}
} }
// 转s字符数组为字符串
return string(s, s + n);
} }
int main() { int main() {
@ -57,7 +56,7 @@ int main() {
g[a][b] = 1; // 有边 g[a][b] = 1; // 有边
floyd(); // 求传递闭包 floyd(); // 求传递闭包
type = check(); // 检查是不是存在矛盾,或者找到了完整的顺序 type = check(); // 检查是不是存在矛盾,或者找到了完整的顺序
if (type) t = i; // 如果找到了顺序,记录是第几次输入后找到顺序 if (type > 0) t = i; // 如果找到了顺序,或者发现了矛盾,记录是第几次输入后发现的
} }
// 即使存在矛盾,也需要继续读入,直到本轮数据读入完成 // 即使存在矛盾,也需要继续读入,直到本轮数据读入完成
} }
@ -67,10 +66,8 @@ int main() {
else if (type == 2) else if (type == 2)
printf("Inconsistency found after %d relations.\n", t); printf("Inconsistency found after %d relations.\n", t);
else { else {
memset(st, 0, sizeof st); string ans = getorder(); // 输出升序排列的所有变量
printf("Sorted sequence determined after %d relations: ", t); printf("Sorted sequence determined after %d relations: %s.\n", t, ans.c_str());
for (int i = 0; i < n; i++) printf("%c", get_min());
printf(".\n");
} }
} }
return 0; return 0;

Loading…
Cancel
Save