1.链接地址

https://vjudge.net/problem/POJ-1094#author=TIMEpings

2.问题描述

用小于号"<"来定义两元素之间的关系,并于一个没有重复元素的有序上升序列 从小到大地排列这些元素。
比如说,序列A,B,C,D意味着A<B;B<C;C<D。
在这个问题里,我们会给你一组形如"A<B"的关系,询问你有序序列的合法性或其本身。

输入样例

4 6
A<B
A<C
B<C
C<D
B<D
A<B
3 2
A<B
B<A
26 1
A<Z
0 0

输出样例

Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.

3.解题思路

这道题我觉得难在题意理解。。。

题目就是拓扑排序,但是需要记录是在第几步就可以排出序了,还有第几步开始矛盾,或者压根排不了序

4.算法实现源代码

/**/
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <vector>
#include <cctype>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#define mm(i,v) memset(i,v,sizeof i);
using namespace std;

typedef long long ll;
typedef unsigned long long ull;

const ll INF=99999999999999;
const int inf=999999999;
const int maxn=26+5;
vector<int> e[maxn];
int n,m;
int in[maxn],temp[maxn];
int u,v;
queue<int> q;
char a[4],c[maxn];
int ans,cnt;

int Toposort()
{
    while(!q.empty())
        q.pop();
    for(int i=0;i<n;i++)
        if(!in[i])
            q.push(i);
    bool unsure=false;
    cnt=0;
    while(!q.empty())
    {
        if(q.size()>1)
            unsure=true;
        int qq=q.front();
        c[cnt++]=qq+'A';
        q.pop();
        for(int i=0;i<e[qq].size();i++)
        {
            in[e[qq][i]]--;
            if(in[e[qq][i]]==0)
                q.push(e[qq][i]);
        }
    }
    if(cnt<n)
        return 2;
    if(unsure)
        return 3;
    return 1;
}

bool check(int x,int y)
{
    for(int i=0;i<e[x].size();i++)
        if(e[x][i]==y)
            return true;
    return false;
}

int main()
{
    while(scanf("%d%d", &n, &m) != EOF && (m || n))
    {
        bool f=false;
        int step,flag;
        for(int i=0;i<maxn;i++)
            e[i].clear();
        mm(in,0);
        for(int i=1;i<=m;i++)
        {
            scanf("%s",a);
            if(f)
                continue;
            u=a[0]-'A';
            v=a[2]-'A';
            if(!check(u,v))
            {
                e[u].push_back(v);
                in[v]++;
            }
            memcpy(temp,in,sizeof in);
            flag=Toposort();
            memcpy(in,temp,sizeof temp);
            if(flag!=3)
            {
                f=true;
                step=i;
            }
        }
        if (flag == 1)
        {
            c[cnt] = '\0';
            printf("Sorted sequence determined after %d relations: %s.\n", step, c); 
        }
        else if (flag == 2)
            printf("Inconsistency found after %d relations.\n", step);
        else
            printf("Sorted sequence cannot be determined.\n");
    }
    return 0;
}