这篇题解没有用拓补排序 (嗐 菜就直说)

个人感觉这道题拓补排序没有变种\(Floyd\)好写吧,思维难度也低一点(亲眼目睹机房dalao这道题拓补排序调了很久)。


吐槽结束,开始正题~

对于这道题为什么可以用\(Floyd\),应该就是传递性了。当\(A>B\)时,\(B>C\),那么现在肯定有\(A>C\)了,想想原来的\(Floyd\),是不是也有点传递性的味道。这样一来,我们就可以在已知一部分条件的情况下,求出其他值的大小关系,最后看是不是每个数都跟其他的每一个数确认了关系,如果是,那么这个数的位置也就出来了,也就是排好序了,不是,就输入下一个数,直到满足每个数都跟其他的每一个数确认了关系。如果还是不能很好理解的话,可以看下代码来理解。

具体代码里面有两个可以优化的地方,但是数据太水,不加也能过。

#include <bits/stdc++.h>
using namespace std;
int n , m , T;
int dis[30][30];
int id(char x){ //字母转化为数字
return x - 'A' + 1;
}
int main(){
cin >> n >> m;
T = m;
for(int i = 1; i <= n; i++) dis[i][i] = 1; //这里统一认为自己大于自己(方便一点)
while(T--){
char a , b , c;
cin >> a >> b >> c;
if(dis[id(a)][id(c)]){ //处理矛盾
printf("Inconsistency found after %d relations." , m - T);
return 0;
}
dis[id(c)][id(a)] = 1; //c大于a
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
dis[i][j] = dis[i][j] || (dis[i][k] && dis[k][j]); //变种Floyd i>j和i>k>j都可以表明i>j
/*
for(int i = 1; i <= n; i++) 上面的那个Floyd可以这样优化,因为我们每次只涉及到了a和c,所以只用它们两个更新其他的就可
for(int j = 1; j <= n; j++)
dis[i][j] = dis[i][j] || (dis[i][id(a)] && dis[id(a)][j]);
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
dis[i][j] = dis[i][j] || (dis[i][id(c)] && dis[id(c)][j]);
*/
int f = 1;
for(int i = 1; i <= n; i++){
int x = 0;
for(int j = 1; j <= n; j++)
if(dis[i][j] || dis[j][i]) x++; //如果确定了与其他n个数(包括自己)的关系,那么就可以确定这个数的位置
if(x != n) f = 0;
}
if(f){
printf("Sorted sequence determined after %d relations: " , m - T);
for(int k = 1; k <= n; k++){ //这里应该也能优化,设立一个vis数组,存储当前这个数的位置,如果这个数字的位置早确定了,那么就不算这个数,直接算下一个数 ,具体优化操作不想写了, 原谅我的懒惰T_T
for(int i = 1; i <= n; i++){
int x = 0;
for(int j = 1; j <= n; j++)
if(dis[i][j]) x++; //最小的数只会大于一个数(它自己),第二小的数只会会大于两个数,以此类推
if(x == k) cout << (char)(i + 'A' - 1); //如果符合当前的排名,输出
}
}
cout << "."; //记得这个句号(6泪)
return 0;
}
}
printf("Sorted sequence cannot be determined.");
return 0;
}

双倍经验时间:

P2419

洛谷 P1347 【排序】的更多相关文章

  1. 洛谷——P1347 排序

    洛谷—— P1347 排序 题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们 ...

  2. 洛谷 P1347 排序

    题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们将给你一系列形如A<B ...

  3. 洛谷P1347 排序

    这个题看到很多人写Topo排序,其实这道题第一眼看更像是一个差分约束的裸题QWQ... 令dis[x]表示x的相对大小(1是最小,n是最大),显然,对于一个关系A<B,我们有dis[A]< ...

  4. 【洛谷P1347】排序

    题目大意:给定 N 个变量和 M 个变量之间的偏序关系,问能否求出这 N 个变量之间的一个全序.若能,输出最少利用多少条已知信息即可求的结果,且输出该全序:若无解,输出到第几条已知信息可以判定无解:若 ...

  5. 题解【洛谷P1347】排序

    题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列\(A,B,C,D\) 表示\(A<B,B<C,C<D\).在这道题中,我们将给你一系列 ...

  6. 洛谷P2824 排序

    解:splay + 线段树合并,分裂. 首先有个乱搞做法是外层拿splay维护,有序区间缩成splay上一个节点.内层再开个数据结构支持合并分裂有序集合. 内层我一开始想的是splay,然后就没有复杂 ...

  7. 【题解】洛谷P1975排序

    分块,注意重复的值之间的处理.跟普通分块的操作一样的啦,具体可以参见‘不勤劳的图书管理员’. #include <bits/stdc++.h> using namespace std; # ...

  8. 洛谷P3953 逛公园(NOIP2017)(最短/长路,拓扑排序,动态规划)

    洛谷题目传送门 又是一年联赛季.NOIP2017至此收官了. 这个其实是比较套路的图论DP了,但是细节有点恶心. 先求出\(1\)到所有点的最短路\(d1\),和所有点到\(n\)的最短路\(dn\) ...

  9. 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)

    洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...

随机推荐

  1. Java实现 LeetCode 440 字典序的第K小数字

    440. 字典序的第K小数字 给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字. 注意:1 ≤ k ≤ n ≤ 109. 示例 : 输入: n: 13 k: 2 输出: 10 解释: ...

  2. Java实现 LeetCode 143 重排链表

    143. 重排链表 给定一个单链表 L:L0→L1→-→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节 ...

  3. Java实现 蓝桥杯VIP 算法提高 进制转换

    算法提高 进制转换 时间限制:1.0s 内存限制:256.0MB 问题描述 程序提示用户输入三个字符,每个字符取值范围是0-9,A-F.然后程序会把这三个字符转化为相应的十六进制整数,并分别以十六进制 ...

  4. java实现股票的风险

    股票的风险 股票风险 股票交易上的投机行为往往十分危险.假设某股票行为十分怪异,每天不是涨停(上涨10%)就是跌停(下跌10%).假设上涨和下跌的概率均等(都是50%).再假设交易过程没有任何手续费. ...

  5. Docker安装及阿里云镜像加速器配置

    Docker安装 Windows系统安装就不用说了,因为Docker是开源的,所以,直接去官网:https://www.docker.com/下载安装包安装就行了 其实,Linux系统安装也很简单,照 ...

  6. Java 8 新特性——检视阅读

    Java 8 新特性--检视阅读 参考 Java 8 新特性--菜鸟 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的 ...

  7. C#基础篇——委托

    前言 在本章中,主要是借机这个C#基础篇的系列整理过去的学习笔记.归纳总结并更加理解透彻. 在.Net开发中,我们经常会遇到并使用过委托,如果能灵活的掌握并加以使用会使你在编程中游刃有余,然后对于很多 ...

  8. akka-typed(7) - cluster:sharding, 集群分片

    在使用akka-typed的过程中发现有很多地方都简化了不少,变得更方便了,包括:Supervision,只要用Behaviors.supervise()把Behavior包住,很容易就可以实现这个a ...

  9. python基础:如何使用 pip 安装第三方库

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 在这个生活中处处都是大数据和人工智能的时代,总是能在各种角落看到 Pyth ...

  10. Jupyter notebook中的Cell and Line Magics

    参考资料: https://www.jianshu.com/p/81ada9234788 https://my.oschina.net/u/2306127/blog/832510 首先,Cell an ...