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 }