#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int MAX_N = 100;
int cnt = 0;// 记录当前存在比较的数目
int vis[MAX_N], h[MAX_N], to[MAX_N * MAX_N], ne[MAX_N * MAX_N], idx, indegree[MAX_N];
bool graph[MAX_N][MAX_N];
void add(int u, int v) {
ne[idx] = h[u], to[idx] = v, h[u] = idx++;
}
struct edgs {
int l, r;
};
vector<edgs> edg;
vector<int> nums;
vector<int> ans;
bool vis1[MAX_N];
int indegree1[MAX_N];
int n, m;
bool check1() {
memset(indegree1, 0, sizeof indegree1);
memcpy(indegree1, indegree, sizeof indegree);
memset(vis1, false, sizeof vis1);
queue<int> q;
for (int i = 0; i < nums.size(); i++) {
if (indegree1[nums[i]] == 0) {
q.push(i);
}
}
if (q.empty() && cnt != 0) {
return true;
}
while (!q.empty()) {
int u = q.front();
q.pop();
vis1[u] = true;
for (int i = h[u]; i != -1; i = ne[i]) {
int v = to[i];
if (--indegree1[v] == 0) {
q.push(v);
}
}
}
for (int i = 0; i < nums.size(); i++) {
if (!vis1[nums[i]]) {
return true;
}
}
return false;
}
// 拓扑排序过程中 q的大小必须维持在1,否则就无法确定
bool vis2[MAX_N];
int indegree2[MAX_N];
bool check2() {
// 还有未参加比较的数据
if (nums.size() < n)
return false;
queue<int> q2;
for (int i = 0; i < nums.size(); i++) {
if (indegree[nums[i]] == 0) {
q2.push(i);
}
}
ans.clear();
memset(indegree2, 0, sizeof indegree2);
memcpy(indegree2, indegree, sizeof indegree);
memset(vis2, false, sizeof vis2);
while (!q2.empty()) {
if (q2.size() != 1)
return false;
int u = q2.front();
ans.push_back(u);
q2.pop();
for (int i = h[u]; i != -1; i = ne[i]) {
int v = to[i];
if (--indegree2[v] == 0) {
q2.push(v);
}
}
}
return true;
}
int main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
char a, op, b;
cin >> n >> m;
memset(h, -1, sizeof h);
for (int i = 0; i < m; i++) {
cin >> a >> op >> b;
edg.push_back({ a - 'A',b - 'A' });
getchar();
}
int type = 2; // 0正常 1表示矛盾 2表示无法确定
for (int i = 0; i < edg.size(); i++) {
int u = edg[i].l, v = edg[i].r;
if (!vis[u]) { // 不存在比较
vis[u] = 1;
cnt++;
nums.push_back(u);
}
if (!vis[v]) {
vis[v] = 1;
cnt++;
nums.push_back(v);
}
if (!graph[u][v]) {
add(u, v);
graph[u][v] = true;
indegree[v]++;
if (check1()) {
type = 1;
printf("Inconsistency found after %d relations.", i + 1);
break;
}
if (check2()) { // 检查是否可以得到正确的序列
type = 0;
// 结果
printf("Sorted sequence determined after %d relations: ", i + 1);
for (auto& t : ans) {
cout << char('A' + t);
}
cout << ".";
break;
}
}
}
if (type == 2) { // 不是因为冲突
// 检查是否出现不能确定的情况,并存储正常情况
printf("Sorted sequence cannot be determined.");
}
return 0;
}
第一个WA掉的样例数据:
26 26
A<B
B<C
C<D
D<E
E<F
F<G
G<H
H<I
I<J
J<K
K<L
L<M
M<N
N<O
O<P
P<Q
Q<R
R<S
S<T
T<U
U<V
V<W
W<X
X<Y
Y<Z
Z<A
正确结果:
Sorted sequence determined after 25 relations: ABCDEFGHIJKLMNOPQRSTUVWXYZ.
代码结果:
Sorted sequence determined after 25 relations: ABCDEFGHIJKLMNOPQRSTUVWXYZ.
难道这两个不一样吗???懵