zoukankan      html  css  js  c++  java
  • luogu P1347 排序

    题目描述

    一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列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.
    

     topo排序

    #include <cstdio>
    #include <iostream>
    #include <queue>
    using namespace std;
    const int N = 36;
    queue<int>que;
    int n,m;
    bool vis[N];
    struct node{
        int v,next;
    }edge[N*N/2];
    int many=0;
    int rd[N],rdd[N];int head[N];int num;
    void Add_edge(int x,int y)
    {
        edge[++num].v=y;edge[num].next=head[x];head[x]=num;
    }
    int cnt;
    int can[N];
    int topsort()
    {
        cnt=0;int num=0;
        for(int i=1;i<=26;i++)
        {
            rdd[i]=rd[i];
            if(rdd[i]==0&&vis[i])num++,que.push(i),can[++cnt]=i;
        }
        if(!num)return 1;
        bool a=0;
        while(!que.empty())
        {
            int u=que.front();
            que.pop();int aa=0;
            for(int i=head[u];i;i=edge[i].next)
            {
                int v=edge[i].v;
                rdd[v]--;
                if(rdd[v]==0)
                {
                    can[++cnt]=v;
                    aa++;
                    if(aa>=2)a=1;
                    que.push(v);
                }
            }
        }
        if(cnt!=many)return 1;
        if(num>1||a)return 2;
        return 0;
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        char a[10];
        for(int i=1;i<=m;i++)
        {
            scanf("%s",a);
            int tmp=a[0]-'A'+1;
            int ttmp=a[2]-'A'+1;
            rd[ttmp]++;
            if(!vis[tmp])many++;if(!vis[ttmp])many++;
            vis[tmp]=1; vis[ttmp]=1;
            Add_edge(tmp,ttmp);    
            if(topsort()==1)
            {
                printf("Inconsistency found after %d relations.",i);return 0;
            }
            if(!topsort()&&cnt==n)
            {
                printf("Sorted sequence determined after %d relations:",i);
                for(int j=1;j<=cnt;j++)
                {
                    putchar(can[i]+'A'-1);
                }
                //if(can)
                printf(".");
                return 0;
            }
        }
        puts("Sorted sequence cannot be determined.");
        return 0;
    }
  • 相关阅读:
    PHP 大小写转换、首字母大写、每个单词首字母大写转换相关函数
    【论文学习4】BiSample: Bidirectional Sampling for Handling Missing Data with Local Differential Privacy
    【论文学习3】Local Differential Privacy for Deep Learning
    【论文学习2】 Differential Privacy Reinforcement Learning
    深度学习中的优化算法
    Spatial crowdsourcing
    “pip install tensorflow ”出现错误
    python或pip'不是内部或外部命令”
    pip install torch出现错误
    打不开gitHub的解决方法
  • 原文地址:https://www.cnblogs.com/sssy/p/7100342.html
Copyright © 2011-2022 走看看