zoukankan      html  css  js  c++  java
  • POJ-1094 Sorting It All Out && luogu1347 排序 (拓扑排序)

    题目描述

    一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列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 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    System.Security.Cryptography.CryptographicException: 系统找不到指定的文件。
    AOP之三 Java平台研究
    c#中对"Crossthread operation not valid"错误的处理办法
    AOP之二 技术基础
    Fedora14安装Nvidia驱动的过程
    undefined reference问题总结
    深度解析VC中的消息传递机制
    DLL导出类方法
    VC++中把一个对话框最小化到托盘
    AOP之四 .Net平台研究
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/7782720.html
Copyright © 2011-2022 走看看