热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Tetris排名系统(拓扑排序与并查集的应用)

本题旨在通过给定的评级信息,利用拓扑排序和并查集算法来确定全球Tetris高手排行榜。题目要求判断是否可以根据提供的信息生成一个明确的排名表,或者是否存在冲突或信息不足的情况。

Tetris 排名系统
时间限制: 1000/1000 MS (Java/Others)    内存限制: 32768/32768 K (Java/Others)
提交总数: 8539    通过提交数: 2449


问题描述
自从Lele开发了Rating系统后,他的Tetris事业如虎添翼,并迅速推广到全球。为了更好地迎合爱好者的喜好,Lele计划制作一个全球Tetris高手排行榜,定期更新,其知名度甚至超过福布斯富豪榜。排名规则是根据Rating从高到低排列,如果Rating相同,则按RP(人品值)从高到低排列。

Lele需要对N个人进行排名,编号为0到N-1,编号越大,RP越高。Lele从狗仔队那里获得了一些关于Rating的信息,这些信息可能有三种情况:“A > B”、“A = B”和“A
现在Lele想知道,根据这些信息能否确定出这个高手榜。如果可以,则输出“OK”。否则,请判断是信息不完全(输出“UNCERTAIN”),还是信息中包含冲突(输出“CONFLICT”)。注意:如果信息同时包含冲突且不完全,应输出“CONFLICT”。


输入
本题目包含多组测试,请处理到文件结束。每组测试第一行包含两个整数N和M(0≤N≤10000, 0≤M≤20000),分别表示要排名的人数以及得到的关系数。接下来M行,分别表示这些关系。

输出
对于每组测试,在一行里按题目要求输出。

样例输入

3 3
0 > 1
1 <2
0 > 2
4 4
1 = 2
1 > 3
2 > 0
0 > 1
3 3
1 > 0
1 > 2
2 <1


样例输出

OK
CONFLICT
UNCERTAIN


使用并查集将名次相等的合并,保证以下操作都只用到了父节点。当存在环时(cnt != num),表示冲突;当存在多个入度为0的顶点时,条件不够。

代码:
#include
#include
#include
#define MAXN 10000 + 10
using namespace std;
int top, head[MAXN];
int in[MAXN];
int per[MAXN];
int n, m;
struct Edge { int to, next; } edge[2 * MAXN];
struct Node { int a, b; char c; };
Node node[MAXN];
void init() {
top = 0;
memset(head, -1, sizeof(head));
memset(in, 0, sizeof(in));
for (int i = 0; i }
void add(int u, int v) {
Edge E = {v, head[u]};
edge[top] = E;
head[u] = ++top;
in[v]++;
}
int find(int x) { return per[x] == x ? x : per[x] = find(per[x]); }
void merge(int x, int y) {
int fx = find(x), fy = find(y);
if (fx != fy) per[fy] = fx;
}
void topo() {
queue q;
int cnt = 0, num = 0, v;
bool flag = false;
for (int i = 0; i if (per[i] == i) {
++num; // 记录构图的定点个数
if (in[i] == 0) q.push(i);
}
}
if (q.size() > 1) flag = true; // 条件不够
while (!q.empty()) {
v = q.front();
q.pop();
--in[v];
++cnt; // 记录删去的顶点个数,以判断是否冲突
for (int i = head[v]; i != -1; i = edge[i].next) {
Edge E = edge[i];
if (--in[E.to] == 0) q.push(E.to);
}
if (q.size() > 1) flag = true; // 同上
}
if (cnt != num && flag) printf("CONFLICT\n");
else if (flag) printf("UNCERTAIN\n");
else if (num != cnt) printf("CONFLICT\n");
else printf("OK\n");
}
int main() {
while (~scanf("%d%d", &n, &m)) {
init();
for (int i = 0; i scanf("%d %c %d", &node[i].a, &node[i].c, &node[i].b);
if (node[i].c == '=') merge(node[i].a, node[i].b);
}
for (int i = 0; i if (node[i].c == '=') continue;
int fa = find(node[i].a), fb = find(node[i].b);
if (node[i].c == '>') add(fa, fb);
else add(fb, fa);
}
topo();
}
}

推荐阅读
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 本文深入探讨了POJ2762问题,旨在通过强连通分量缩点和单向连通性的判断方法,解决有向图中任意两点之间的可达性问题。文章详细介绍了算法原理、实现步骤,并附带完整的代码示例。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本文介绍了如何在 C# 和 XNA 框架中实现一个自定义的 3x3 矩阵类(MMatrix33),旨在深入理解矩阵运算及其应用场景。该类参考了 AS3 Starling 和其他相关资源,以确保算法的准确性和高效性。 ... [详细]
  • 由二叉树到贪心算法
    二叉树很重要树是数据结构中的重中之重,尤其以各类二叉树为学习的难点。单就面试而言,在 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
author-avatar
国贞馨清
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有