http://poj.org/problem?id=1094

来源:互联网 发布:邮件群发软件效果 编辑:程序博客网 时间:2024/06/05 05:21
Sorting It All Out
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 27774 Accepted: 9616

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 6A<BA<CB<CC<DB<DA<B3 2A<BB<A26 1A<Z0 0

Sample Output

Sorted sequence determined after 4 relations: ABCD.Inconsistency found after 2 relations.Sorted sequence cannot be determined.
注意:要先考虑是否出现拓扑序列,在考虑反向关系,在考虑关系是否完全!
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <vector>using namespace std;bool visit[26];int n, m;bool g[30][30];vector<int>grap[30];char res[30];int ind[30];void init() {   for (int i = 0; i < n; i ++) {        visit[i] = false;        ind[i] = 0;        grap[i].clear();    for (int j = 0; j < n; j ++) {        g[i][j] = false;    }   }}bool check(int x, int y) {    for (int i = 0; i < n; i ++) {        for (int j = 0; j < n; j ++) {            for (int k = 0; k < n; k ++) {                if (g[i][k] && g[k][j]) g[i][j] = true;            }        }    }return g[x][y];}bool topo(int cur) {   if (cur == n) {    res[cur] = '\0';    return true;   }   int cnt = 0;   int pos;   for (int i = 0; i < n; i ++) {     if (!visit[i] && ind[i] == 0) {        pos = i;        cnt ++;     }   }   if (cnt != 1) return false;   visit[pos] = true;   for (int i = 0; i < grap[pos].size(); i ++) {     ind[grap[pos][i]] --;   }   res[cur] = char(pos+65);   if (topo(cur+1) == false) {    visit[pos] = false;    for (int i = 0; i < grap[pos].size(); i ++) {        ind[grap[pos][i]] ++;    }   } else {       return true;   }return false;}int main() {    while (scanf("%d%d", &n, &m), n || m) {        init();        char str[10];        getchar();        bool flag = false;        int ans = -1;        int n_flag=-1;        for (int i = 0; i < m; i ++) {            scanf("%s", str);            if (flag == false) {                flag = check(str[2]-65, str[0]-65);                if (!flag) {                    g[str[0]-65][str[2]-65] = true;                    grap[str[0]-65].push_back(str[2]-65);                    ind[str[2]-65] ++;                    if (ans == -1 && topo(0)) {                        ans = i+1;                    }                } else {                    n_flag = i+1;                }            }        }        if (ans != -1) {            printf("Sorted sequence determined after %d relations: %s.\n", ans, res);        } else if (flag) {            printf("Inconsistency found after %d relations.\n", n_flag);        } else if (flag == false && ans == -1) {            printf("Sorted sequence cannot be determined.\n");        }    }return 0;}


0 0
原创粉丝点击