这个题看到很多人写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. jquery预览本地图片

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...

  2. netty之IO演进之路

    常见IO类型: 传统的同步阻塞I/O编程<BIO> 基于NIO的非阻塞编程 基于NIO2.0的异步非阻塞AIO编程 BIO缺点: 没有数据缓冲区,I/O性能存在问题 没有Channel概念 ...

  3. canvas 计算文字宽度(常用于文字换行)

    var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); ctx.font= ...

  4. EM算法理解的九层境界

    EM算法理解的九层境界 EM 就是 E + M EM 是一种局部下限构造 K-Means是一种Hard EM算法 从EM 到 广义EM 广义EM的一个特例是VBEM 广义EM的另一个特例是WS算法 广 ...

  5. 【NOIP2017模拟6.25】小W的动漫

    题目 小W最近迷上了日本动漫,每天都有无数部动漫的更新等着他去看,所以他必须将所有的动漫排个顺序,当然,虽然有无数部动漫,但除了1号动漫,每部动漫都有且仅有一部动漫是它的前传(父亲),也就是说,所有的 ...

  6. springboot maven打包插件

    <build> <plugins> <!-- springboot maven打包--> <plugin> <groupId>org.spr ...

  7. 【leetcode】1179. Reformat Department Table

    题目如下: SQL Schema Table: Department +---------------+---------+ | Column Name | Type | +------------- ...

  8. mysql 时间索引执行计划

    项目中查询时间断的数据发现查询时间很长.怀疑没有走时间的索引,于是explain一下 EXPLAIN select * from t_order where created_at>'2015-0 ...

  9. OpenQA.Selenium.Chrome Action滑动操作

    //[定位] //滑块元素 var wrapper = driver.FindElement(By.XPath("/html/body/div/div[1]/div[1]/div[2]&qu ...

  10. 对html2canvas的研究

    介绍 该脚本允许您直接在用户浏览器上截取网页或部分网页的“屏幕截图”.屏幕截图基于DOM,因此它可能不是真实表示的100%准确,因为它没有制作实际的屏幕截图,而是根据页面上可用的信息构建屏幕截图. 这 ...