poj 1094 Sorting It All Out(拓扑排序)

Sorting It All Out
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 34927 Accepted: 12240
Description

An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not.
Input

Input consists of multiple problem instances. Each instance starts with a line containing two positive integers n and m. the first value indicated the number of objects to sort, where 2 <= n <= 26. The objects to be sorted will be the first n characters of the uppercase alphabet. The second value m indicates the number of relations of the form A < B which will be given in this problem instance. Next will be m lines, each containing one such relation consisting of three characters: an uppercase letter, the character “<” and a second uppercase letter. No letter will be outside the range of the first n letters of the alphabet. Values of n = m = 0 indicate end of input.
Output

For each problem instance, output consists of one line. This line should be one of the following three:

Sorted sequence determined after xxx relations: yyy…y.
Sorted sequence cannot be determined.
Inconsistency found after xxx relations.

where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy…y is the sorted, ascending sequence.
Sample Input

4 6
A

#include <iostream>
#include <stack>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N = 300;

vector <int>mapp[N];
int IN[N];
int counter;
char ans[N];
int id;
bool flag1;
stack <int> ST1;///用来更新入度为0的点

void init(int n)
{
    for(int i=0;i<n;i++)
    {
        mapp[i].clear();
    }
}
void topsort(int n,int IN[])///处理入度和点与点的连线,
{
    stack<int>ST;
    for(int i=0; i<n; i++)
    {
        if(!IN[i])
        {
            ST.push(i);
            ST1.push(i);///将入度为0的点全部存到ST1中
        }
    }
    while(!ST.empty())///删除与入度为0的节点有连接的点,并加入新的入度为0的点
    {
        if(ST.size()>1)
            flag1=1;
        int t=ST.top();
        ST.pop();
        ans[id++]=t+'A';
        counter++;
        for(int i=0; i<mapp[t].size(); i++)
        {
            int kk=mapp[t][i];
            IN[kk]--;
            if(IN[kk]==0)
                ST.push(kk),ST1.push(kk);
        }
    }
}
int main()
{
    int n, m;
    while (scanf("%d%d", &n, &m) != EOF &&(m|n))
    {
        char a[5];
        init(n);
        memset(IN, 0, sizeof(IN));
        int check = 0;
        int ans1, ans2;
        for (int i = 0; i < m; i ++)///遍历所给的连接
        {
            scanf("%s", a);
            mapp[a[0]-'A'].push_back(a[2]-'A');///建立邻接表
            IN[a[2]-'A'] ++;///数组统计入度
            if (!check)
            {
                flag1 = false;
                id = counter = 0;
                topsort(n, IN);
                if (counter != n)
                {
                    check = 1;
                    ans1 = i+1;
                }
                else if (i == m-1 && flag1 )///出现回路
                    check = 2;
                else if (counter == n && !flag1)///找到完整拓扑
                    ans2 = i+1, check = 3;
                while (ST1.size())///统计入度
                {
                    int kk = ST1.top();
                    ST1.pop();
                    for (int j = 0; j < mapp[kk].size(); j ++)
                    {
                        int s = mapp[kk][j];
                        IN[s] ++;
                    }
                }
            }
        }
        if (check == 1)
        {
            printf("Inconsistency found after %d relations.\n", ans1);
            continue;
        }
        if (check == 2)
        {
            printf("Sorted sequence cannot be determined.\n");
            continue;
        }
        if (check == 3)
        {
            ans[id] = '\0';
            printf("Sorted sequence determined after %d relations: %s.\n",ans2, ans);
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值