zoukankan      html  css  js  c++  java
  • HDU Problem 1811 Rank of Tetris【拓扑排序+并查集】

    Rank of Tetris

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 8484    Accepted Submission(s): 2429

    Problem Description
    自从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"。
     
    Input
    本题目包含多组测试,请处理到文件结束。
    每组测试第一行包含两个整数N,M(0<=N<=10000,0<=M<=20000),分别表示要排名的人数以及得到的关系数。
    接下来有M行,分别表示这些关系
     
    Output
    对于每组测试,在一行里按题目要求输出
     
    Sample Input
    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
     
    Sample Output
    OK CONFLICT UNCERTAIN
     
    Author
    linle
     
    这道题就是麻烦在了等于号,可以将相等的元素看成一个集合,利用并查集的知识,只需要对父节点进行拓扑排序就可以了。
    #include <bits/stdc++.h>
    #define MAXN 10005
    using namespace std;
    struct node1{
        int from, to, next;
    }edge[MAXN*2];
    struct node2{
        int a, b;
        char s[2];
    }V[MAXN*2];
    int par[MAXN], head[MAXN], indegree[MAXN];
    int n, m, num;
    void init() {
        memset(head, -1, sizeof(head));
        memset(indegree, 0, sizeof(indegree));
        num = 0;
        for (int i = 0; i <= n; i++) {
            par[i] = i;
        }
    }
    int Find(int x) {
        if (x == par[x]) return x;
        return par[x] = Find(par[x]);
    }
    void unite(int x, int y) {
        int fx = Find(x);
        int fy = Find(y);
        if (fx != fy)  par[fx] = fy;
    }
    void add(int x, int y) {
        edge[num].from = x;
        edge[num].to = y;
        edge[num].next = head[x];
        head[x] = num++;
    }
    void solved() {
        queue<int> que;
        while (!que.empty()) que.pop();
        int sum = 0, k = 0, l = 0;
        bool flag1 = false, flag2 = false;
        //先把集合找出来
        for (int i = 0; i < n; i++) {
            if (i == par[i]) {
                sum++;
                if (indegree[i] == 0) {
                    que.push(i), k++;
                }
            }
        }
        //同一时刻,入度为零的点应该只有一个
        //如果有两个及其以上,这几个点的先后顺序就无法判断
        if (k > 1) flag1 = true;
        while (que.size()) {
            int v = que.front();
            que.pop(); l++, k = 0;
            for(int i = head[v]; i != -1; i = edge[i].next){
                int w = edge[i].to; indegree[w]--;
                if (indegree[w] == 0){
                    que.push(w); k++;
                }
            }
            if(k > 1) flag1 = true;
        }
        if(l != sum) flag2 = true;
        if(flag2) printf("CONFLICT
    ");
        else if (flag1) printf("UNCERTAIN
    ");
        else printf("OK
    ");
    }
    int main() {
        while (scanf("%d%d", &n, &m) != EOF) {
            init();
            for (int i = 0; i < m; i++) {
                scanf("%d%s%d", &V[i].a, V[i].s, &V[i].b);
                if (V[i].s[0] == '=') unite(V[i].a, V[i].b);
            }
            for (int i = 0; i < m; i++) {
                if(V[i].s[0] == '=') continue;
                int fb = Find(V[i].b), fa = Find(V[i].a);
                if (V[i].s[0] == '>') {
                    add(fa, fb); indegree[fb]++;
                }
                else {
                    add(fb, fa); indegree[fa]++;
                }
            }
            solved();
        }
        return 0;
    }
    
    
    
  • 相关阅读:
    Lucene in action 笔记 case study
    关于Restful Web Service的一些理解
    Lucene in action 笔记 analysis篇
    Lucene in action 笔记 index篇
    Lucene in action 笔记 term vector
    Lucene in action 笔记 search篇
    博客园开博记录
    数论(算法概述)
    DIV, IFRAME, Select, Span标签入门
    记一个较困难的SharePoint性能问题的分析和解决
  • 原文地址:https://www.cnblogs.com/cniwoq/p/6770855.html
Copyright © 2011-2022 走看看