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

原创 2015年11月17日 16:33:12
题目链接:[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;
}


版权声明:欢迎转载(^ω^)~不过转载请注明原文出处:http://blog.csdn.net/catglory ლ(╹◡╹ლ)

相关文章推荐

HDU Problem 1811 Rank of Tetris【拓扑排序+并查集】

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

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

Rank of Tetris Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) To...

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

这道题麻烦的就是有两个数相等的情况出现 我们使用并查集,将相等的并在一起 再用拓扑排序 将入度为0的点push进去 1.队列里面如果有>=2的点,那么代表这信息不完全不能判断 2.如果入队的...

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

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...
  • zugofn
  • zugofn
  • 2016年08月06日 10:39
  • 106

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

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

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

Rank of Tetris Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) To...
  • Puyar_
  • Puyar_
  • 2016年07月24日 11:25
  • 149

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

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

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

做法:把等于的用并查集放一起,找出最小的数,也就是入度为零的数。然后开始拓扑,拓扑就是每次把入度为0,也就是剩下点中最小的数拿来,再把它的上一个入度减掉。 如果有点没访问,就是说明有环,说明矛盾。 ...

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

题目链接:Click here~~ 题意: 中文题啊中文题。 解题思路: 此题关键的一点是要意识到排序时,Rating相同的人一定排列在一起,且顺序一定存在。 故可以...
  • dgq8211
  • dgq8211
  • 2012年07月21日 16:00
  • 651

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

问题描述: Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球。为了更好的符合那些爱好者的喜好,Lele又想...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[HDU 1811]Rank of Tetris[拓扑排序][并查集]
举报原因:
原因补充:

(最多只允许输入30个字)