POJ1094 Sorting It All Out (floyd传递闭包)

关系具有传递性,可以用floyd解决。

将关系都看做i<j的形式,令d[i][j]=1,如果d[i][j]=d[j][i]=1,说明矛盾;d[i][j]=d[j][i]=0,说明i与j的关系无法确定。

按顺序枚举每个关系,可以求出“”至少要前t个关系确定每两个变量之间的关系“的t值是多少,枚举过程中有矛盾直接return,枚举完了标记没有改变,说明不能确定每两个变量之间的关系。

代码是参考的算法竞赛进阶指南,题目不算很难,实现过程有点意思:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 const int N = 30;
 7 int n, m, d[N][N], e[N][N];
 8 
 9 int floyd() {
10     memcpy(e, d, sizeof(e));
11     for (int k = 0; k < n; k++)
12         for (int i = 0; i < n; i++)
13             for (int j = 0; j < n; j++) {
14                 e[i][j] |= e[i][k] & e[k][j];
15                 if (e[i][j] == e[j][i] && e[i][j] && i != j) return -1;
16             }
17     for (int i = 0; i < n; i++)
18         for (int j = 0; j < n; j++)
19             if (e[i][j] == e[j][i] && !e[i][j] && i != j) return 0;
20     return 1;
21 }
22 
23 void Sorting_It_All_Out() {
24     memset(d, 0, sizeof(d));
25     bool flag = 1;
26     for (int i = 1; i <= m; i++) {
27         char s[6];
28         scanf("%s", s);
29         d[s[0]-'A'][s[2]-'A'] = 1;
30         if (flag) {
31             int now = floyd();
32             if (now == -1) {
33                 printf("Inconsistency found after %d relations.\n", i);
34                 flag = 0;
35             } else if (now == 1) {
36                 printf("Sorted sequence determined after %d relations: ", i);
37                 pair<int, char> ans[N];
38                 for (int j = 0; j < n; j++) {
39                     ans[j].first = 0;
40                     ans[j].second = 'A' + j;
41                 }
42                 for (int j = 0; j < n; j++)
43                     for (int k = 0; k < n; k++)
44                         if (e[j][k]) ++ans[j].first;
45                 sort(ans, ans + n);
46                 for (int j = n - 1; j >= 0; j--) printf("%c", ans[j].second);
47                 puts(".");
48                 flag = 0;
49             }
50         }
51     }
52     if (flag) puts("Sorted sequence cannot be determined.");
53 }
54 
55 int main() {
56     while (cin >> n >> m && n) Sorting_It_All_Out();
57     return 0;
58 }

 

posted @ 2022-07-17 22:07  YHXo  阅读(19)  评论(0编辑  收藏  举报