HDU-1811-Rank of Tetris
Posted ydddd
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU-1811-Rank of Tetris相关的知识,希望对你有一定的参考价值。
链接:https://vjudge.net/problem/HDU-1811
题意:
自从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"。
思路:
拓扑排序,并查集,
因为存在两个人等级相等,所以用并查集将等级相等的人连起来,
同时对总人数减1,每次只找老大就好了。
同时再拓扑的时候,队列里的人数超过1就说明有人不能准确确认名次。
代码:
#include <iostream> #include <memory.h> #include <vector> #include <map> #include <algorithm> #include <cstdio> #include <math.h> #include <queue> #include <string> #include <stack> #include <iterator> #include <stdlib.h> #include <time.h> #include <assert.h> using namespace std; typedef long long LL; const int MAXN = 1e4+10; int F[MAXN]; int l[2*MAXN], r[2*MAXN]; int in[MAXN]; char op[2*MAXN]; vector<int> G[MAXN]; int n, m; int num; void Init() { for (int i = 1;i <= n;i++) F[i] = i; for (int i = 1;i <= n;i++) G[i].clear(); memset(in, 0, sizeof(in)); } int Get_F(int x) { if (F[x] == x) return x; F[x] = Get_F(F[x]); return F[x]; } bool Union(int l, int r) { int tl = Get_F(l); int tr = Get_F(r); if (tl == tr) return false; F[tl] = tr; return true; } void Tupo() { queue<int> que; for (int i = 1;i <= n;i++) { if (in[i] == 0 && i == Get_F(i)) que.push(i); } int flag = 0; while (!que.empty()) { if (que.size() > 1) flag = 1; int u = que.front(); que.pop(); num--; //cout << u << endl; for (auto v:G[u]) { //cout << in[v] << endl; if (--in[v] == 0) que.push(v); } } //cout << num << endl; if (num > 0) cout << "CONFLICT" << endl; else if (flag) cout << "UNCERTAIN" << endl; else cout << "OK" << endl; } int main() { while (~scanf("%d%d", &n, &m)) { Init(); num = n; for (int i = 1;i <= m;i++) { scanf("%d %c %d", &l[i], &op[i], &r[i]); l[i]++, r[i]++; if (op[i] == ‘=‘) { if (Union(l[i], r[i])) num--; } } for (int i = 1;i <= m;i++) { if (op[i] != ‘=‘) { int tl = Get_F(l[i]); int tr = Get_F(r[i]); if (op[i] == ‘>‘) { G[tl].push_back(tr); ++in[tr]; } else { G[tr].push_back(tl); ++in[tl]; } } } Tupo(); } return 0; }
以上是关于HDU-1811-Rank of Tetris的主要内容,如果未能解决你的问题,请参考以下文章
HDU 1811 Rank of Tetris ??????????????? + ????????????
HDU 1811:Rank of Tetris(并查集+拓扑排序)
hdu 1811 Rank of Tetris 并查集+拓扑排序
HDU 1811 Rank of Tetris(拓扑排序+并查集)