懵!错误样例结果一致但WA!
  • 板块P1347 排序
  • 楼主petrioch
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/2/24 16:08
  • 上次更新2023/10/23 23:57:47
查看原帖
懵!错误样例结果一致但WA!
392679
petrioch楼主2023/2/24 16:08
#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.

难道这两个不一样吗???懵

2023/2/24 16:08
加载中...