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

个人感觉这道题拓补排序没有变种\(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实现 蓝桥杯VIP 算法训练 s01串

    题目描述 s01串初始为" 0" 按以下方式变换 0变1,1变01 数据规模和约定 0~19 输入 1个整数(0~19) 输出 n次变换后s01串 样例输入 3 样例输出 101 ...

  2. Java实现 LeetCode 279 完全平方数

    279. 完全平方数 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, -)使得它们的和等于 n.你需要让组成和的完全平方数的个数最少. 示例 1: 输入: n = 12 输出: ...

  3. Java实现 谁不爱打牌

    谁不爱打牌 [问题描述] BobLee最近在复习考研,但是他也喜欢打牌(有谁不爱玩牌呢?).但是作为一名ACMER,斗地主显然满足不了他的兴趣, 于是他和YYD一起YY出来了一个游戏规则,规则如下. ...

  4. Java实现 蓝桥杯VIP 算法提高 3-2字符串输入输出函数

    算法提高 3-2字符串输入输出函数 时间限制:1.0s 内存限制:512.0MB 描述 编写函数GetReal和GetString,在main函数中分别调用这两个函数.在读入一个实数和一个字符串后,将 ...

  5. java实现自行车行程

    ** 自行车行程** 计算行程 低碳生活,有氧运动.骑自行车出行是个好主意.小明为自己的自行车装了个计数器,可以计算出轮子转动的圈数.在一次骑车旅行中,出发时计算器的示数为begin,到达目的地时的示 ...

  6. 扩展.Django-权限系统

    目录 Django权限系统auth User 新建用户 认证用户 修改密码 登录 退出登录 只允许登录的用户访问 Group Permission 检查用户权限 管理用户权限 自定义权限 Django ...

  7. Spring-AOP之工作实践(一)

    案例一.角色校验 项目中,对某些方法需要用户具备指定角色权限才能执行. /** * 角色校验注解 */ @Retention(RetentionPolicy.RUNTIME) @Target(Elem ...

  8. PIP 更换国内安装源

    linux: 修改 ~/.pip/pip.conf (没有就创建一个), 内容如下: [global] index-url = https://pypi.tuna.tsinghua.edu.cn/si ...

  9. Dedecms升级php版本{dede:field.body/}不解析,文章内容不显示

    Dedecms升级php7后发布文章后,发现前端显示的文章内容都是空白,只能显示标题.关键词.描述等. 第一种方法: 把{dede:field.body /}删除,使用 下面的sql 标签代码替换: ...

  10. [博主推荐]如何利用注册 的 bug 来疯狂注册,不停开小号"做"事情,支持 手机号&邮箱

    [博主推荐]如何利用注册 的 bug 来疯狂注册,不停开小号"做"事情,支持 手机号&邮箱  非常简单 1.手机号注册: 用手机号注册 网站基本都支持 可以用推荐的网址: ...