关系具有传递性,可以用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 }

最新文章

  1. 奇异值分解(SVD)原理与在降维中的应用
  2. iTunes访问自己应用的沙盒
  3. java 类加载顺序
  4. Ajax乱码问题
  5. hdu 1573 A/B (扩展欧几里得)
  6. django删除migrations
  7. 关于Http协议(2)--转载
  8. Ubuntu 使用wget 命令下载JDK
  9. 深入浅出 ThreadLocal(一)
  10. android 轮播图
  11. [图形学] 习题8.12 NLN二维线段裁剪算法实现
  12. 【DDD】领域驱动设计实践 —— Domain层实现
  13. linux_nginx环境配置
  14. cocos2d-x初探
  15. tmux 使用说明
  16. linux 防火墙 iptables 目录
  17. html5的websocket
  18. 两排序数组的中位数 Median of Two Sorted Arrays
  19. XML 解析的两种方法
  20. python 2 python3 共存

热门文章

  1. Class对象功能概述和Class对象功能获取Field
  2. 体验Lambda的更优写法和Lambda标准格式
  3. 浅淡 Apache Kylin 与 ClickHouse 的对比
  4. 如何在win下安装dlib的whl文件(Anaconda方式)
  5. Web 前端实战:JQ 实现下拉菜单
  6. as 和 which 引导非限制性定语从句的区别
  7. MySQL字段类型与操作
  8. Shell第一章《变量》
  9. 2步就可以压缩PPT大小,再也不怕C盘飘红了!
  10. Spring源码-xml解析