【洛谷P1347】排序
题目大意:给定 N 个变量和 M 个变量之间的偏序关系,问能否求出这 N 个变量之间的一个全序。若能,输出最少利用多少条已知信息即可求的结果,且输出该全序;若无解,输出到第几条已知信息可以判定无解;若读到最后一条信息也无法判断,输出无法判断。
题解:偏序关系自然对应着一个有向图,每一个已知信息等价为给这个有向图加一条边,若能够得到全序,则证明拓扑排序过程中能够找出一条长度为 N 的链,若无解,则是在拓扑排序过程中存在自环,否则就是无法判断。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=30;
vector<int> G[maxn];
char ops[10];
int n,m,idx,indeg[maxn],tmp[maxn],stk[maxn],top,d[maxn];//d[i]为以 i 结尾的最长路径
bool circle,certain;
inline void add_edge(int from,int to){G[from].push_back(to),++indeg[to];}
void topo_sort(int now){
queue<int> q;int dep=1;//dep为当前DAG上的最长路径的长度
for(int i=1;i<=n;i++)d[i]=0;
for(int i=1;i<=n;i++){
tmp[i]=indeg[i];
if(!tmp[i])q.push(i),d[i]=1;
}
top=0;
while(q.size()){
int u=q.front();q.pop();
stk[++top]=u;
for(int i=0;i<G[u].size();i++){
int v=G[u][i];--tmp[v];
if(!tmp[v])q.push(v);
d[v]=max(d[v],d[u]+1);
dep=max(dep,d[v]);
}
}
if(top^n)circle=1,idx=now;
else if(dep==n)certain=1,idx=now;
}
void solve(){
for(int i=1;i<=m;i++){
scanf("%s",ops+1);
if(circle||certain)break;
int from=ops[1]-'A'+1,to=ops[3]-'A'+1;
add_edge(from,to);
topo_sort(i);
}
if(certain){
printf("Sorted sequence determined after %d relations: ",idx);
for(int i=1;i<=n;i++)printf("%c",stk[i]+'A'-1);
printf(".\n");
}
else if(circle)printf("Inconsistency found after %d relations.\n",idx);
else printf("Sorted sequence cannot be determined.\n");
}
int main(){
scanf("%d%d",&n,&m);
solve();
return 0;
}
【洛谷P1347】排序的更多相关文章
- 洛谷——P1347 排序
洛谷—— P1347 排序 题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们 ...
- 洛谷 P1347 排序
题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D.在这道题中,我们将给你一系列形如A<B ...
- 洛谷P1347 排序
这个题看到很多人写Topo排序,其实这道题第一眼看更像是一个差分约束的裸题QWQ... 令dis[x]表示x的相对大小(1是最小,n是最大),显然,对于一个关系A<B,我们有dis[A]< ...
- 题解【洛谷P1347】排序
题目描述 一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列\(A,B,C,D\) 表示\(A<B,B<C,C<D\).在这道题中,我们将给你一系列 ...
- 洛谷 P1347 【排序】
这篇题解没有用拓补排序 (嗐 菜就直说) 个人感觉这道题拓补排序没有变种\(Floyd\)好写吧,思维难度也低一点(亲眼目睹机房dalao这道题拓补排序调了很久). 吐槽结束,开始正题~ 对于这道题为 ...
- 洛谷P2824 排序
解:splay + 线段树合并,分裂. 首先有个乱搞做法是外层拿splay维护,有序区间缩成splay上一个节点.内层再开个数据结构支持合并分裂有序集合. 内层我一开始想的是splay,然后就没有复杂 ...
- 【题解】洛谷P1975排序
分块,注意重复的值之间的处理.跟普通分块的操作一样的啦,具体可以参见‘不勤劳的图书管理员’. #include <bits/stdc++.h> using namespace std; # ...
- 洛谷P3953 逛公园(NOIP2017)(最短/长路,拓扑排序,动态规划)
洛谷题目传送门 又是一年联赛季.NOIP2017至此收官了. 这个其实是比较套路的图论DP了,但是细节有点恶心. 先求出\(1\)到所有点的最短路\(d1\),和所有点到\(n\)的最短路\(dn\) ...
- 洛谷P4332 [SHOI2014]三叉神经树(LCT,树剖,二分查找,拓扑排序)
洛谷题目传送门 你谷无题解于是来补一发 随便百度题解,发现了不少诸如树剖\(log^3\)LCT\(log^2\)的可怕描述...... 于是来想想怎么利用题目的性质,把复杂度降下来. 首先,每个点的 ...
随机推荐
- [UWP 自定义控件]了解模板化控件(2.1):理解ContentControl
UWP的UI主要由布局容器和内容控件(ContentControl)组成.布局容器是指Grid.StackPanel等继承自Panel,可以拥有多个子元素的类.与此相对,ContentControl则 ...
- vs2017安装
每次安装包都搞的很大,而且出各式各式的问题. 安装程序清单签名失败 运行'vs_Enterprise.exe'时,出现'安装程序清单签名失败'的错误,直接删除'vs_installer.opc'文件, ...
- open-falcon ---客户机agent操作
open-falcon的agent用于采集机器负载监控指标,比如cpu.idle.load.1min.disk.io.util等等,每隔60秒push给Transfer.agent与Transfer建 ...
- Nginx负载均衡中后端节点服务器健康检查的操作梳理
正常情况下,nginx做反向代理,如果后端节点服务器宕掉的话,nginx默认是不能把这台realserver踢出upstream负载集群的,所以还会有请求转发到后端的这台realserver上面,这样 ...
- Linux运维笔记-日常操作命令总结(1)
在linux日常运维中,我们平时会用到很多常规的操作命令. 查看服务器的外网ip [root@redis-new01 ~]# curl ifconfig.me [root@redis-new01 ~] ...
- 浅谈JS的作用域链(二)
上一篇文章中介绍了Execution Context中的三个重要部分:VO/AO,scope chain和this,并详细的介绍了VO/AO在JavaScript代码执行中的表现. 本文就看看Exec ...
- PAT甲级题解-1066. Root of AVL Tree (25)-AVL树模板题
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6803291.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- 先埋锅-CF-Valid BFS?-差一点没交上
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...
- react-native 基础知识的学习
react已经用了半年多了,年后有时间想探究一下奇妙的react-native,还别说确实刁,具体哪里刁后面会补充,因为搭建教程,以及入门教程没来得及写,这里先来写一些基础知识的心得. 为什么reac ...
- shell脚本--函数
shell的函数和Javacript和php的函数声明一样,只不过shell在调用函数的时候,只需要写函数名就可以调用函数,注意不要在函数名后面加括号 创建并使用函数 #!/bin/bash #文件名 ...