hdu1811 Rank of Tetris

  这道题是拓扑排序和并查集的综合运用。

  由于排行榜是一种从高到低的排序。所以在拓扑排序的时候,如果有一次加入的入度为零的点数大于1,就有变得不确定了(UNCERTAIN)。

  由于只有一棵树,当树的数量大于1,就矛盾。还有一种产生矛盾的可能是,当输入的是a>b(或者a<b)时,但是并查集中他们的父节点相同。因为这题的一个集合其实被当成了一个点。这样不相等的相等就是矛盾的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10010, M =20010;
struct node
{
    int to, next;
};
node edge[M];
int ind[N], head[N],que[N],f[N],L[N],R[N];
int iq,tot,num,FLAG;
char ch[N];
int Find(int x)
{
    if(x==f[x]) return x;
    return f[x]=Find(f[x]);
}
void topo(int n)
{
    int i,k,j=0,s;
    for(i=0;i<n;i++)
        if(ind[i]==0&&i==Find(i)) que[j++]=i;
    FLAG=0;
    if(j>1) FLAG=1;
    s=j;
    for(i=0;i<j;i++)
    {
        if(j-s>1) FLAG=1;
        s=j;
        int u=que[i];
        num--;
        for(k=head[u]; k!=-1; k=edge[k].next)
        {
            ind[edge[k].to]--;
            if(ind[edge[k].to]==0)
                que[j++]=edge[k].to;
        }
    }
    iq=j;
}
void addedge(int i,int j)
{
    edge[tot].to=j;edge[tot].next=head[i];head[i]=tot++;
}

void Link(int i,int j)
{
    int a=Find(i),b=Find(j);
    if(a!=b) {f[b]=a;}
}
void init()
{
    tot=0;
    for(int i=0;i<N;i++)
    {
        f[i]=i;
        head[i]=-1;
        ind[i]=0;
    }
}
int main()
{
    //freopen("test.txt","r",stdin);
    int n,m,i,j,k;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        init();
        int flag=1;
        num=n;
        for(i=0;i<m;i++)
        {
            scanf("%d %c %d",&L[i],&ch[i],&R[i]);
            if(ch[i]==‘=‘) {Link(L[i],R[i]);num--;}
        }
        for(i=0;i<m;i++)
        {
            if(ch[i]==‘=‘) continue;
            int a=Find(L[i]),b=Find(R[i]);
            if(a==b) flag=0;
            if(ch[i]==‘>‘) {addedge(a,b); ind[b]++;}
            else {addedge(b,a); ind[a]++;}
        }
        topo(n);
        if(num>1||!flag) printf("CONFLICT\n");
        else if(FLAG) printf("UNCERTAIN\n");
        else printf("OK\n");
    }
    return 0;
}
时间: 2024-07-29 16:08:01

hdu1811 Rank of Tetris的相关文章

HDU1811 Rank of Tetris 【缩点】+【拓扑排序】

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5447    Accepted Submission(s): 1526 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想

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    Accepted Submission(s): 1947 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想

HDU-1811 Rank of Tetris

拓扑排序难题. 对于相同排名的玩家,我们将他们组成一个集合.这可以用并查集实现. 然后将并查集看成一个点,将所有大于小于的关系转换成集合中的关系,这个过程就可以判断方案是否冲突了. 然后拓扑排序求排名,顺便也就可以判断结果是否唯一了. #include <cstdio> #include <algorithm> #include <iostream> #include <cctype> #include <queue> #include <

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

1 #include <stdio.h> 2 #include <string.h> 3 #include <vector> 4 #include <queue> 5 using namespace std; 6 struct node//边 7 { 8 int a, b;//顶点 9 char ch;//运算符 10 }c[10005]; 11 vector<int>map[10005];//map数组存贮邻接表 (大佬都是这么开数组的) 12

HDU1811 Rank of Tetris (并查集)

这道理重要的想法就是利用并查集缩点,将所有相等的点缩成同一个点 因为如果不缩点,那么如果两个数相等,其他的数与他们中任意一个数有关系,就需要把相等的数的关系也都连上,也就是加边.这样十分复杂 我们又可以发现,如果缩点,因为每个点本身有rp值,所以缩成的点能排序的话,原先也可以.就是基于这个原理证明的缩点的正确性 缩完点后进行拓扑排序,我们发现,如果最后拓扑完的点并不是所有点,说明有环,则conflict,如果可以拓扑,说明是信息不完全,因为会有至少两个点是并列的 如果能全排列,说明ok,代码中一

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

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9267    Accepted Submission(s): 2668 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想

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

http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球.为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响.关于如何排名,这个不用说都知道是根据Rating从高到低来排,如果两个人具有相同的Rating,那就按

hdu 1811 Rank of Tetris 并查集+拓扑排序,,提高题

Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5672    Accepted Submission(s): 1616 Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想

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

Rank of Tetris Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜,定时更新,名堂要比福布斯富豪榜还响.关于如何排名,这个不用说都知道是根据Rating从高到低