这个题看到很多人写Topo排序,其实这道题第一眼看更像是一个差分约束的裸题QWQ...

令dis[x]表示x的相对大小(1是最小,n是最大),显然,对于一个关系A<B,我们有dis[A]<dis[B],也就是dis[A]<=dis[B]-1,然后我们就可以建一条从B到A的权值为-1的有向边.

而我们最后要求的就是dis[x]的最小值,为了使它们的值都落在1~n之间,我们新建一个虚拟的点0,并令dis[0]=0且dis[x]>dis[0].

这样我们要求的就是dis[x]-dis[0]的最小值啦~\(≧▽≦)/~.

显然这可以转换为一个图论问题(也就是最长路),我比较喜欢用最短路,所以把它转化一下变成-(dis[0]-dis[x]).

dis[0]-dis[x]就是x到0的最短路,我们可以把它转变成一个单源最短路,就是建反向边,跑一个以0为起点的单源最短路就可以啦,最后记得取相反数哦

By 520Enterprise

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int n,m,dis[maxn],in[maxn],cnt[maxn],head[maxn],eps,tot,vis[maxn];
struct edge
{
int to,next,quan;
}e[maxn];
deque<int>q;
inline int read()
{
int x=,f=;
char ch=getchar();
while(ch<''||ch>'')
{
if(ch=='-')
f=-;
ch=getchar();
}
while(ch>=''&&ch<='')
{
x=(x<<)+(x<<)+(ch^);
ch=getchar();
}
return x*f;
}
inline void write(int a)
{
if(a<)
{
char a='-',b='';
putchar(a);
putchar(b);
}
else
{
if(a>=)
write(a/);
putchar(a%+'');
}
}
void add(int to,int from,int quan)
{
e[++tot]=(edge){to,head[from],quan};
head[from]=tot;
}
int SPFA(int s)
{
// memset(dis,0x3f,sizeof(dis));
memset(cnt,,sizeof(cnt));
memset(vis,,sizeof(vis));
in[s]=,q.push_front(s);
in[]=,q.push_front();
while(!q.empty())
{
int now=q.front();
q.pop_front();
in[now]=;
// cout<<"now "<<now<<' '<<dis[now]<<endl;
for(int i=head[now];i;i=e[i].next)
{
int to=e[i].to;
if(dis[to]>dis[now]+e[i].quan)
{
dis[to]=dis[now]+e[i].quan;
if(++cnt[to]>n)
return ;
if(!in[to])
{
if(dis[to]<dis[q.front()]+eps||(<=cnt[to]&&cnt[to]<=eps))
q.push_front(to);
else
q.push_back(to);
in[to]=;
}
}
// cout<<"to "<<to<<' '<<dis[to]<<endl;
}
}
for(int i=;i<=n;++i)
vis[-dis[i]]=;
for(int i=;i<=n;++i)
if(!vis[i])
return -;
return ;
}
int main()
{
memset(dis,0x3f,sizeof(dis));
dis[]=;
n=read(),m=read(),tot=;
for(int i=;i<=n;++i)
add(i,,-);
eps=sqrt(n);
for(int i=;i<=m;++i)
{
char ch1,ch2,ch3;
cin>>ch1>>ch2>>ch3;
add(ch3-'A'+,ch1-'A'+,-);
int flag=SPFA(ch1-'A'+);
if(!flag)
{
printf("Inconsistency found after %d relations.",i);
return ;
}
else if(flag>)
{
printf("Sorted sequence determined after %d relations: ",i);
for(int j=;j<=n;++j)
for(int k=;k<=n;++k)
if(dis[k]==-j)
{
putchar('A'+k-);
break;
}
putchar('.');
return ;
}
}
printf("Sorted sequence cannot be determined.");
return ;
}

洛谷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】排序

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

  4. 题解【洛谷P1347】排序

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

  5. 洛谷 P1347 【排序】

    这篇题解没有用拓补排序 (嗐 菜就直说) 个人感觉这道题拓补排序没有变种\(Floyd\)好写吧,思维难度也低一点(亲眼目睹机房dalao这道题拓补排序调了很久). 吐槽结束,开始正题~ 对于这道题为 ...

  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阻塞队列得实现

    阻塞队列与普通队列的不同在于.当队列是空的时候,从队列中获取元素的操作将会被阻塞,或者当队列满时,往队列里面添加元素将会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插 ...

  2. LAMP 系统性能调优之内核调优措施

    LAMP 系统性能调优之内核调优措施 2011-03-18 11:21 Sean A. Walberg 网络转载 字号:T | T 在对系统的 Apache.PHP 和 MySQL 组件进行调优之前, ...

  3. 如何提升scrapy爬取数据的效率

    在配置文件中修改相关参数: 增加并发 默认的scrapy开启的并发线程为32个,可以适当的进行增加,再配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100. ...

  4. Redis(一)

    1 单机MySQL的美好时代2 Memcached(缓存)+MySQL+垂直拆分3 MySQL主从读写分离4 分库分表+水平拆分+mysql拆分5 MySQL的扩展瓶颈6 为什么使用NoSQLNoSQ ...

  5. 【Spring】Spring-Session-Data-Redis实现session共享

    前言 在开发中遇到一个关于用户体验的问题,每次当运维进行更新重启服务器时,都会导致会员平台中已登录的用户掉线.这是因为每个用户的会话信息及状态都是由session来保存的,而session对象是由服务 ...

  6. 【NOIP2014模拟11.3】噪音

    题目 FJ有M个牛棚,编号1至M,刚开始所有牛棚都是空的.FJ有N头牛,编号1至N,这N头牛按照编号从小到大依次排队走进牛棚,每一天只有一头奶牛走进牛棚.第i头奶牛选择走进第p[i]个牛棚.由于奶牛是 ...

  7. Linux缺少动态连接库.so--cannot open shared object file: No such file or directory

    1 Liunx安装报错时,缺少动态链接库时,形式如下: /usr/local/libexec/gcc/x86_64-unknown-liunx-gnu/4.8.2/cc1: error while l ...

  8. 苹果CMSv10宝塔全自动定时采集教程

    伙伴们在建立好自己的网站添加自定义资源库后,由于手动采集方式比较耗时间和精力更新也不够及时,是不是特别希望能有一个全自动定时采集方法来帮助网站增加视频资源解放自己的双手,那么现在就教大家如何用宝塔一步 ...

  9. VTK 编译过程中出现的hdf5长度(I64)错误解决办法

    最近在使用vtk和cuda做大规模图像处理方面的问题研究,在编译vtk的过程中发现第三方库hdf5不能够解决I64长度的探测识别问题.为了节约大家的时间,现在把我经过实践得到的解决方案共享出来,这里要 ...

  10. [BZOJ2870]最长道路tree:点分治

    算法一:点分治+线段树 分析 说是线段树,但是其实要写树状数组卡常. 代码 #include <bits/stdc++.h> #define rin(i,a,b) for(register ...