luogu P1347 排序

Posted Nico&11101001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于luogu P1347 排序的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1347 排序

P1347 排序

P1347 排序(拓扑排序)

P1347 排序

题解 P1347 排序

Luogu1137 旅行计划(拓扑排序)