码迷,mamicode.com
首页 > 编程语言 > 详细

luogu1347 排序 (拓扑排序)

时间:2017-11-04 13:28:50      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:有序   def   拓扑   queue   namespace   char   tchar   names   个数   

题目描述

一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列A,B,C,D 表示A<B,B<C,C<D。在这道题中,我们将给你一系列形如A<B的关系,并要求你判断是否能够根据这些关系确定这个数列的顺序。

输入输出格式

输入格式:

 

第一行有两个整数n,m,n表示需要排序的元素数量,2<=n<=26,第1到n个元素将用大写的A,B,C,D....表示。m表示将给出的形如A<B的关系的数量。

接下来有m行,每行有3个字符,分别为一个大写字母,一个<符号,一个大写字母,表示两个元素之间的关系。

 

输出格式:

 

若根据前x个关系即可确定这n个元素的顺序yyy..y(如ABC),输出

Sorted sequence determined after xxx relations: yyy...y.

若根据前x个关系即发现存在矛盾(如A<B,B<C,C<A),输出

Inconsistency found after 2 relations.

若根据这m个关系无法确定这n个元素的顺序,输出

Sorted sequence cannot be determined.

(提示:确定n个元素的顺序后即可结束程序,可以不用考虑确定顺序之后出现矛盾的情况)

 

输入输出样例

输入样例#1: 复制
1:
4 6
A<B
A<C
B<C
C<D
B<D
A<B

2:
3 2
A<B
B<A

3:
26 1
A<Z
输出样例#1: 复制
1:
Sorted sequence determined after 4 relations: ABCD.
2:
Inconsistency found after 2 relations.
3:
Sorted sequence cannot be determined.

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 typedef long long LL;
 4 const int MAX=40;
 5 int n,m,f[MAX][MAX],du[MAX];
 6 int tot,head[MAX],adj[MAX],next[MAX];
 7 inline int read(){
 8     char c=getchar();while (c<A || c>Z) c=getchar();return c-A+1;
 9 }
10 void addedge(int u,int v){
11     tot++,du[v]++;adj[tot]=v,next[tot]=head[u],head[u]=tot;
12 }
13 void floyd(){
14     int i,j,k;
15     for (k=1;k<=n;k++)
16         for (i=1;i<=n;i++)
17             for (j=1;j<=n;j++)
18                 f[i][j]|=f[i][k]&f[k][j];
19 }
20 void topsort(int cas){
21     int i,j,dd[MAX];
22     queue <int> q,ans;
23     for (i=1;i<=n;i++) dd[i]=du[i];
24     for (i=1;i<=n;i++) if (!dd[i]) q.push(i);
25     if (q.size()>1) return;
26     while (!q.empty()){
27         int u=q.front();q.pop();ans.push(u);
28         for (i=head[u];i;i=next[i]){
29             dd[adj[i]]--;
30             if (!dd[adj[i]]){
31                 q.push(adj[i]);
32                 if (q.size()>1) return;
33             }
34         }
35     }
36     printf("Sorted sequence determined after %d relations: ",cas);
37     while (!ans.empty()) putchar(ans.front()+A-1),ans.pop();putchar(.);
38     exit(0);
39 }
40 int main(){
41     freopen ("sort.in","r",stdin);freopen ("sort.out","w",stdout);
42     int i,j,u,v;
43     scanf("%d%d",&n,&m);
44     for (i=1;i<=m;i++){
45         u=read(),v=read();
46         if (f[v][u] || u==v) return printf("Inconsistency found after %d relations.",i),0;
47         if (!f[u][v]) f[u][v]=1,addedge(u,v);
48         floyd();topsort(i);
49     }
50     puts("Sorted sequence cannot be determined.");
51     return 0;
52 }

 

luogu1347 排序 (拓扑排序)

标签:有序   def   拓扑   queue   namespace   char   tchar   names   个数   

原文地址:http://www.cnblogs.com/keximeiruguo/p/7782720.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!