优美的大乔 2023-07-16 10:50 采纳率: 94.7%
浏览 5
已结题

HDU - 1811 Rank of Tetris **榜 拓扑排序

**榜
题目描述:
自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球。

为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris**排行榜,定时更新,名堂要比福布斯富豪榜还响。关于如何排名,这个不用说都知道是根据Rating从高到低来排,如果两个人具有相同的Rating,那就按这几个人的RP从高到低来排。

终于,Lele要开始行动了,对N个人进行排名。为了方便起见,每个人都已经被编号,分别从0到N-1,并且编号越大,RP就越高。
同时Lele从狗仔队里取得一些(M个)关于Rating的信息。这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B,等于B,小于B。

现在Lele并不是让你来帮他制作这个榜,他只是想知道,根据这些信息是否能够确定出这个榜,是的话就输出"OK"。否则就请你判断出错的原因,到底是因为信息不完全(输出"UNCERTAIN"),还是因为这些信息中包含冲突(输出"CONFLICT")。
注意,如果信息中同时包含冲突且信息不完全,就输出"CONFLICT"。
输入格式:
测试第一行包含两个整数N,M(0<=N<=10000,0<=M<=20000),分别表示要排名的人数以及得到的关系数。
接下来有M行,分别表示这些关系。

输出格式:
第一行里按题目要求输出。

样例输入:
3 3
0 > 1
1 < 2
0 > 2

样例输出:
OK
时间限制: 1000ms
空间限制: 256MB
题目:https://wzoi.cc/s/1/1000


#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(3,"Ofast","inline")
int n, m, a[10001], z[10001], N, c[10001], b[10001];
char v[10001];
int find(int x) {
    if (a[x] == x) return x;
    else return a[x] = find(a[x]);
}
vector<vector<int>> q;
int main() {
    cin >> n >> m;
    N = n;
    for (int i = 1; i <= n; i++) a[i] = i;
    for (int i = 1; i <= m; i++) {
        cin >> b[i] >> v[i] >> c[i];
        if (v[i] == '=') {
            int W = find(b[i]), E = find(c[i]);
            if (W != E) {
                a[W] = E;
            }
            N--;
        }
    }
    q.resize(n + 1);
    for (int i = 1; i <= m; i++) {
        int W = find(b[i]), E = find(c[i]);
        if (v[i] == '>') {
            if (W == E) {
                cout << "CONFLICT" << endl;
                return 0;
            }
            q[W].push_back(E);
            z[E]++;
        } else {
            if (W == E) {
                cout << "CONFLICT" << endl;
                return 0;
            }
            q[E].push_back(W);
            z[W]++;
        }
    }
    queue<int> w;
    bool flag = false;
    int s = 0;
    for (int i = 1; i <= n; i++) {
        if (z[i] == 0 && a[i] == i) w.push(i);
    }
    while (!w.empty()) {
        s++;
        int x = w.front();
        if (w.size() > 1) flag = true;
        w.pop();
        for (int i = 0; i < q[x].size(); i++) {
            z[q[x][i]]--;
            if (z[q[x][i]] == 0) w.push(q[x][i]);
        }
    }
    if (N > s) cout << "CONFLICT" << endl;
    else if (flag) cout << "UNCERTAIN" << endl;
    else cout << "OK" << endl;
    return 0;
}

样例输出“CONFLICT”,应该是逻辑错误,但找不出bug,望神牛纠正……

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-16 12:16
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月14日
  • 已采纳回答 8月6日
  • 创建了问题 7月16日

悬赏问题

  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂
  • ¥15 数字信号处理考试111
  • ¥100 关于#audobe audition#的问题,如何解决?
  • ¥15 allegro17.2生成bom表是空白的
  • ¥15 请问一下怎么打通CAN通讯
  • ¥20 如何在 rocky9.4 部署 CDH6.3.2?
  • ¥35 navicat将excel中的数据导入mysql出错
  • ¥15 rt-thread线程切换的问题
  • ¥20 python忆阻器数字识别
  • ¥15 高通uboot 打印ubi init err 22