热门标签 | 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();
}
}

推荐阅读
  • 本文详细介绍了Java中的输入输出(IO)流,包括其基本概念、分类及应用。IO流是用于在程序和外部资源之间传输数据的一套API。根据数据流动的方向,可以分为输入流(从外部流向程序)和输出流(从程序流向外部)。此外,还涵盖了字节流和字符流的区别及其具体实现。 ... [详细]
  • 不确定性|放入_华为机试题 HJ9提取不重复的整数
    不确定性|放入_华为机试题 HJ9提取不重复的整数 ... [详细]
  • 深入理解Shell脚本编程
    本文详细介绍了Shell脚本编程的基础概念、语法结构及其在操作系统中的应用。通过具体的示例代码,帮助读者掌握如何编写和执行Shell脚本。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • Startup 类配置服务和应用的请求管道。Startup类ASP.NETCore应用使用 Startup 类,按照约定命名为 Startup。 Startup 类:可选择性地包括 ... [详细]
  • 使用Pandas高效读取SQL脚本中的数据
    本文详细介绍了如何利用Pandas直接读取和解析SQL脚本,提供了一种高效的数据处理方法。该方法适用于各种数据库导出的SQL脚本,并且能够显著提升数据导入的速度和效率。 ... [详细]
  • 本文介绍了如何使用Java中的同步方法和同步代码块来实现两个线程的交替打印。一个线程负责打印1到52的数字,另一个线程负责打印A到Z的字母,确保输出顺序为12A34B...5152Z。 ... [详细]
  • 本文介绍了一种从与src同级的config目录中读取属性文件内容的方法。通过使用Java的Properties类和InputStream,可以轻松加载并获取指定键对应的值。 ... [详细]
  • 在Java中,this是一个引用当前对象的关键字。如何通过this获取并显示其所指向的对象的属性和方法?本文详细解释了this的用法及其背后的原理。 ... [详细]
  • Java 中的月减()方法 ... [详细]
  • Java 数组及其常用操作
    本文详细介绍了 Java 中的数组类型、定义方法以及常见操作,帮助开发者更好地理解和使用 Java 数组。 ... [详细]
  • Scala与Java的数据类型对比及特性
    本文将深入探讨Scala和Java在数据类型上的差异与相似之处,重点介绍两种语言的基本类型、引用类型及其包装类,并分析它们在面向对象编程中的表现。 ... [详细]
  • 本文介绍了Android开发中Intent的基本概念及其在不同Activity之间的数据传递方式,详细展示了如何通过Intent实现Activity间的跳转和数据传输。 ... [详细]
  • 本文深入探讨了POJ2762问题,旨在通过强连通分量缩点和单向连通性的判断方法,解决有向图中任意两点之间的可达性问题。文章详细介绍了算法原理、实现步骤,并附带完整的代码示例。 ... [详细]
  • 本文介绍了一种解决二元可满足性(2-SAT)问题的方法。通过具体实例,详细解释了如何构建模型、应用算法,并提供了编程实现的细节和优化建议。 ... [详细]
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社区 版权所有