关闭

[HDU 1811]Rank of Tetris[拓扑排序][并查集]

标签: 拓扑排序并查集
288人阅读 评论(0) 收藏 举报
分类:
题目链接:[HDU 1811]Rank of Tetris[拓扑排序][并查集]

题意分析:

给出的关系中是否存在矛盾,是否无法确定关系?两者都有,输出"矛盾"即可。

解题思路:

排名大小关系,很容易想到拓扑排序。问题在于,什么情况下是不确定的?当处理队列中有多个点时,就是不能确定的情况,因为后继操作可以选择多个不同的开始。需要注意的是本题存在等于的情况,这时需要将相等的两者合并,合并之后再开始建边,使得信息共享。

个人感受:

不知道怎么确定不确定关系。。。。心塞。

具体代码如下:

#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;

const int INF = 0x7f7f7f7f;
const int MAXN = 1e4 + 111;

vector<int> G[MAXN];
int p[MAXN], in[MAXN], a[MAXN], b[MAXN];
char cmp[2 * MAXN];

int find(int x)
{
    return x == p[x] ? x : p[x] = find(p[x]);
}

void unite(int x, int y)
{
    x = find(x), y = find(y);
    if (x != y) p[x] = y;
}

int main()
{
    int n, m;
    while (~scanf("%d%d", &n, &m))
    {
        for (int i = 0; i < n; ++i) G[i].clear(), p[i] = i, in[i] = 0;
        int sum = n;
        for (int i = 0; i < m; ++i)
        {
            scanf("%d %c %d", &a[i], &cmp[i], &b[i]);
            if (cmp[i] == '=') unite(a[i], b[i]), --sum; // 相等的看作一个整体
        }
        bool conf = 0, uncer = 0;
        for (int i = 0; i < m; ++i)
        {
            if (cmp[i] == '=') continue;
            int x = find(a[i]), y = find(b[i]);
            if (x == y) conf = 1; // 等级相同却又存在绝对大小关系,矛盾
            if (cmp[i] == '>') G[x].push_back(y), ++in[y];
            else G[y].push_back(x), ++in[x];
        }

        queue<int> q;
        for (int i = 0; i < n; ++i)
        {
            int cur = find(i);
            if (!in[cur] && p[cur] == i) q.push(cur);
        }

        while (q.size())
        {
            int cur = q.front(); q.pop(); --sum;
            if (q.size()) uncer = 1;  // 多个点可以操作,无法确定哪一个
            for (int i = 0; i < G[cur].size(); ++i)
            {
                int v = G[cur][i];
                if (--in[v] == 0) q.push(v);
            }
        }

        if(sum > 0 || conf) printf("CONFLICT\n");
        else if(uncer) printf("UNCERTAIN\n");
        else printf("OK\n");
    }
    return 0;
}


0
0
查看评论

hdu1811 Rank of Tetris(拓扑排序+并查集)

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6920...
  • su20145104009
  • su20145104009
  • 2015-08-07 13:21
  • 2049

HDU 1811 Rank of Tetris(拓扑排序+并查集)

链接: http://acm.hdu.edu.cn/showproblem.php?pid=1811 题目: Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球。 为了更好的...
  • shuangde800
  • shuangde800
  • 2012-09-08 10:14
  • 2200

hdu1811 Rank of Tetris

题目链接:here 分析: 并查集 + 拓扑排序, 特别注意当输入里面 为 = 号的情况下,不要把 较小的数的father直接赋值给 较大的数,因为可能会影响后来的结果。。我就因为这个卡了一会。。。。。 代码中,sum数组来判断是否满足拓扑排序的要求。。。 代码: #include #i...
  • liuqiyao_01
  • liuqiyao_01
  • 2013-04-29 16:51
  • 2015

hdu 1811 Rank of Tetris 并查集+拓扑排序★★

Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球。 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响。关于如何排名,这个不...
  • qq_30591245
  • qq_30591245
  • 2017-08-12 10:23
  • 59

hdu 1811 Rank of Tetris (并查集 + 拓扑排序)

题目:         链接:点击打开链接
  • u013147615
  • u013147615
  • 2014-06-30 17:49
  • 246

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...
  • lututu123
  • lututu123
  • 2016-08-06 10:00
  • 184

HDU 1811 Rank of Tetris -- 并查集+拓扑排序

Rank of TetrisTime Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7126 Accepted Submission(s)...
  • qq_26437925
  • qq_26437925
  • 2015-09-06 20:25
  • 217

hdu 1811 Rank of Tetris(拓扑排序+并查集)

自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球。为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响。关于如何排名,这个不用说都知道是根据Rating从高到低来排,如果...
  • w__gavin
  • w__gavin
  • 2017-10-21 13:03
  • 44

hdu 1811 Rank of Tetris 并查集+拓扑排序

做法:把等于的用并查集放一起,找出最小的数,也就是入度为零的数。然后开始拓扑,拓扑就是每次把入度为0,也就是剩下点中最小的数拿来,再把它的上一个入度减掉。 如果有点没访问,就是说明有环,说明矛盾。 如果队列同时有两个点在,说明这两个点大小关系不明,不明确。
  • u013532224
  • u013532224
  • 2015-07-10 14:42
  • 552

hdu 1811 Rank of Tetris (并查集+拓扑排序)

题意: 有编号为0-n-1的n个人,用>、=、 按RP从高到低排。编号越大RP越高。 给出m个RATING关系,判断根据这些信息能否确定高手榜,如果能,输出OK。 如果信息冲突就输出CONFLICT,如果信息不完全则输出UNCERTAIN。 算法: 先把相等Rating的编...
  • u012841845
  • u012841845
  • 2014-04-09 14:53
  • 930
    个人资料
    • 访问:114391次
    • 积分:3354
    • 等级:
    • 排名:第11941名
    • 原创:228篇
    • 转载:8篇
    • 译文:0篇
    • 评论:29条
    联系我:
    最新评论