From a720cef8e4c42644fcac9c8001c925dbea2cea65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E6=B5=B7?= <10402852@qq.com> Date: Wed, 3 Jan 2024 13:45:17 +0800 Subject: [PATCH] 'commit' --- TangDou/AcWing_TiGao/T3/Floyd/343.md | 86 +++++++++++++------------ TangDou/AcWing_TiGao/T3/Floyd/343_1.cpp | 7 +- TangDou/AcWing_TiGao/T3/Floyd/343_2.cpp | 54 ++++++++-------- 3 files changed, 76 insertions(+), 71 deletions(-) diff --git a/TangDou/AcWing_TiGao/T3/Floyd/343.md b/TangDou/AcWing_TiGao/T3/Floyd/343.md index 4c3c56e..b8a7eb0 100644 --- a/TangDou/AcWing_TiGao/T3/Floyd/343.md +++ b/TangDou/AcWing_TiGao/T3/Floyd/343.md @@ -171,28 +171,30 @@ string getorder(){ #include using namespace std; -// Floyd解决传送闭包问题 -const int N = 27; -int n; // n个变量 -int m; // m个不等式 -int f[N][N]; // 传递闭包结果 +const int N = 26; +int n, m; +int g[N][N]; +bool st[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 + g[i][j] |= g[i][k] && g[k][j]; } -// 1:可以确定两两之间的关系,2:矛盾,3:不能确定两两之间的关系 + int check() { - // 如果i> n >> m, n && m) { - string S; - int k = 3; // 3:不能确定两两之间的关系 - memset(f, 0, sizeof f); // 初始化邻接矩阵 - // m条边 + while (cin >> n >> m, n || m) { + memset(g, 0, sizeof g); // 邻接矩阵 + int type = 0, t; // type: 0=还需要继续给出条件 1=找到了顺序 2=存在冲突 + // t:在第几次输入后找到了顺序,不能中间break,因为那样会造成数据无法完成读入,后续的操作无法进行,只能记录下来当时的i 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> s; + int a = s[0] - 'A', b = s[2] - 'A'; // A->0,B->1,...,Z->25完成映射关系 + + if (!type) { // 如果不存在矛盾,就尝试找出大小的顺序 + g[a][b] = 1; // 有边 + floyd(); // 求传递闭包 + type = check(); // 检查是不是存在矛盾,或者找到了完整的顺序 + if (type > 0) t = i; // 如果找到了顺序,或者发现了矛盾,记录是第几次输入后发现的 } + // 即使存在矛盾,也需要继续读入,直到本轮数据读入完成 + } + + if (!type) + puts("Sorted sequence cannot be determined."); + else if (type == 2) + printf("Inconsistency found after %d relations.\n", t); + else { + string ans = getorder(); // 输出升序排列的所有变量 + printf("Sorted sequence determined after %d relations: %s.\n", t, ans.c_str()); } - // 所有表达式都输入了,仍然定不下来关系 - if (k == 3) printf("Sorted sequence cannot be determined.\n"); } return 0; } diff --git a/TangDou/AcWing_TiGao/T3/Floyd/343_1.cpp b/TangDou/AcWing_TiGao/T3/Floyd/343_1.cpp index 7283744..433d725 100644 --- a/TangDou/AcWing_TiGao/T3/Floyd/343_1.cpp +++ b/TangDou/AcWing_TiGao/T3/Floyd/343_1.cpp @@ -38,8 +38,11 @@ string getorder() { // 升序输出所有变量 // n - cnt - 1 = 6-5-1 = 0,也就是A放在第一个输出的位置上, 之所以再-1,是因为下标从0开始 s[n - cnt - 1] = i + 'A'; } - // 转s字符数组为字符串 - return string(s, s + n); + + // 转s字符数组为字符串 + string res; + for (int i = 0; i < n; i++) res = res + s[i]; + return res; } int main() { diff --git a/TangDou/AcWing_TiGao/T3/Floyd/343_2.cpp b/TangDou/AcWing_TiGao/T3/Floyd/343_2.cpp index 4dc24bf..ee997b3 100644 --- a/TangDou/AcWing_TiGao/T3/Floyd/343_2.cpp +++ b/TangDou/AcWing_TiGao/T3/Floyd/343_2.cpp @@ -4,39 +4,41 @@ using namespace std; const int N = 26; int n, m; -bool d[N][N]; +bool g[N][N]; bool st[N]; int check() { for (int i = 0; i < n; i++) - if (d[i][i]) return 2; + if (g[i][i]) return 2; for (int i = 0; i < n; i++) for (int j = 0; j < i; j++) - if (!d[i][j] && !d[j][i]) return 0; + if (!g[i][j] && !g[j][i]) return 0; return 1; } -char get_min() { - for (int i = 0; i < n; i++) - if (!st[i]) { - bool flag = true; - for (int j = 0; j < n; j++) - if (!st[j] && d[j][i]) { - flag = false; - break; - } - if (flag) { - st[i] = true; - return 'A' + i; - } - } +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 += g[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字符数组为字符串 + string res; + for (int i = 0; i < n; i++) res = res + s[i]; + return res; } int main() { while (cin >> n >> m, n || m) { - memset(d, 0, sizeof d); + memset(g, 0, sizeof g); int type = 0, t; for (int i = 1; i <= m; i++) { @@ -45,13 +47,13 @@ int main() { int a = str[0] - 'A', b = str[2] - 'A'; if (!type) { - d[a][b] = 1; + g[a][b] = 1; for (int x = 0; x < n; x++) { - if (d[x][a]) d[x][b] = 1; - if (d[b][x]) d[a][x] = 1; + if (g[x][a]) g[x][b] = 1; + if (g[b][x]) g[a][x] = 1; for (int y = 0; y < n; y++) - if (d[x][a] && d[b][y]) - d[x][y] = 1; + if (g[x][a] && g[b][y]) + g[x][y] = 1; } type = check(); if (type) t = i; @@ -63,10 +65,8 @@ int main() { else if (type == 2) printf("Inconsistency found after %d relations.\n", t); else { - memset(st, 0, sizeof st); - printf("Sorted sequence determined after %d relations: ", t); - for (int i = 0; i < n; i++) printf("%c", get_min()); - printf(".\n"); + string ans = getorder(); // 输出升序排列的所有变量 + printf("Sorted sequence determined after %d relations: %s.\n", t, ans.c_str()); } }