Sorting It All Out

 

 

 

 

 1 #include <bits/stdc++.h>
 2 const int N=100000;
 3 using namespace std;
 4 vector<int>E[N];
 5 int in[N],n,pos,flag,ok,m,sort1[N],stop,tmp[N];
 6 char X,Y,O;
 7 queue<int>q;
 8 void init() {
 9     memset(in, 0, sizeof(in));
10     for (int i = 0; i < n; i++) {
11         E[i].clear();
12     }
13 }
14 
15 bool find(int u,int v) {
16     for (int i = 0; i < E[u].size(); ++i)
17         if (E[u][i] == v)
18             return 1;
19     return 0;
20 }
21 
22 int toposort() {
23     while (!q.empty()) {
24         q.pop();
25     }
26     for (int i = 0; i < n; i++) {
27         if (!in[i]) {
28             q.push(i);
29         }
30     }
31     pos = 0;
32     bool f = 0;
33     while (!q.empty()) {
34         if (q.size() > 1) {
35             f = 1;
36         }
37         int k = q.front();
38         q.pop();
39         sort1[pos++] = k;
40         for (int i = 0; i < E[k].size(); i++) {
41             if (--in[E[k][i]] == 0) {
42                 q.push(E[k][i]);
43             }
44         }
45     }
46     if (pos < n) return 1;
47     if (f) return 2;
48     return 3;
49 }
50 
51 
52 int main() {
53     while (~scanf("%d%d%*c", &n, &m)) {
54         if (n == 0 && m == 0) {
55             break;
56         }
57         init();
58         flag = 2;
59         ok = 0;
60         for (int i = 1; i <= m; i++) {
61             scanf("%c%c%c%*c", &X, &O, &Y);
62             if (ok) {
63                 continue;
64             }
65             int x = X - 'A', y = Y - 'A';
66             if (O == '<' && !find(y, x)) {
67                 E[y].push_back(x);
68                 in[x]++;
69             } else {
70                 if (O == '>' && !find(x, y)) {
71                     E[x].push_back(y);
72                     in[y]++;
73                 }
74             }
75             memcpy(tmp, in, sizeof(in));
76             flag = toposort();
77             memcpy(in, tmp, sizeof(in));
78             if (flag != 2) {
79                 stop = i;
80                 ok = 1;
81             }
82         }
83         if (flag == 3) {
84             printf("Sorted sequence determined after %d relations: ", stop);
85             for (int i = pos - 1; i >= 0; i--) {
86                 printf("%c", sort1[i] + 'A');
87             }
88             printf(".\n");
89         }
90         if (flag == 1) {
91             printf("Inconsistency found after %d relations.\n", stop);
92         }
93         if (flag == 2) {
94             printf("Sorted sequence cannot be determined.\n");
95         }
96     }
97 }
View Code

 

posted @ 2019-07-23 15:57  Snow_in_winer  阅读(169)  评论(0编辑  收藏  举报