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

来源:互联网 发布:linux 调度算法 编辑:程序博客网 时间:2024/06/08 15:59

Rank of Tetris

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


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 30 > 11 < 20 > 24 41 = 21 > 32 > 00 > 13 31 > 01 > 22 < 1
 

Sample Output
OKCONFLICTUNCERTAIN
 

Author
linle
 

Source
HDOJ 2007 Summer Exercise(2)
 

Recommend
lcy   |   We have carefully selected several similar problems for you:  1198 1558 1213 1102 1823 
 这道题比较难想到的就是把利用并查集把相等的建成一棵树,即合并,每次排序的是树的根节点
排序中如果有些边没有用到,说明存在矛盾
#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>using namespace std;struct node{int to,next;}edge[220000];int head[11000];int in[11000];int num;int pre[11000];int vis[11000];void add(int a,int b){edge[num].to=b;edge[num].next=head[a];head[a]=num++;in[b]++;}void init(){memset(head,-1,sizeof(head));memset(in,0,sizeof(in));memset(vis,0,sizeof(vis));num=0;}int find(int x){if(x==pre[x])return x;return pre[x]=find(pre[x]);}void join(int x,int y){int fx=find(x);int fy=find(y);pre[fx]=fy;}void top(int n,int sum){    int i,j,t,ans=0,k=0,c=0;    while(1){k=0;for(i=0;i<n;i++){if(pre[i]==i&&!vis[i]&&in[i]==0)    {    k++;    if(k==1)    {    t=i;    vis[i]=1;}     }}if(k==0)break;if(k>1)//同时存在多个入度为0的点 ,说明信息不完善 ans=1;    for(i=head[t];i!=-1;i=edge[i].next)    {    int tmp=edge[i].to;    c++;    in[tmp]--;}}if(c!=sum)//排序中有些边没有用到,说明存在矛盾 printf("CONFLICT\n");else if(ans)printf("UNCERTAIN\n");else printf("OK\n"); }int main(){int n,m,a[21000],b[21000],i,j,sum;char str[21000][5];while(scanf("%d%d",&n,&m)!=EOF){init();for(i=0;i<=n;i++)pre[i]=i; sum=m;for(i=1;i<=m;i++){scanf("%d%s%d",&a[i],str[i],&b[i]);if(strcmp(str[i],"=")==0){     join(a[i],b[i]);     sum--;}}        for(i=1;i<=m;i++)        {        int aa,bb;        aa=find(a[i]);        bb=find(b[i]);        if(strcmp(str[i],"<")==0)add(aa,bb);else if(strcmp(str[i],">")==0)add(bb,aa);}top(n,sum);}return 0;}



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 5角硬币吞进肚子怎么办 孩子吞了5角硬币怎么办 左腿比右腿微粗怎么办 一个腿长一个腿短怎么办 刚买的毛笔很硬怎么办 我哥哥太爱我了怎么办 如果婚姻无法维持该怎么办 捡了一只流浪狗怎么办 微博加载不出来怎么办 我的脾气很暴躁怎么办 歌单恢复已删除怎么办 家里破产了我该怎么办 对付有心计的人怎么办 上嘴唇无故肿了怎么办 下嘴唇肿了一半怎么办 狗狗早上叫不停怎么办 狗在家乱咬东西怎么办 狗狗晚上一直叫怎么办 金毛幼犬晚上叫怎么办 金毛晚上老是叫怎么办 5岁宝宝总尿裤子怎么办 2岁宝宝尿裤子怎么办 2周岁宝宝尿裤子怎么办 5岁宝宝尿裤子怎么办 模拟人生4不怀孕怎么办 狗狗的毛打结怎么办 狗狗生病了不吃东西怎么办 给领导送礼不收怎么办 国外弃货,货代怎么办 不小心拜了阴庙怎么办 要考试了不想考怎么办? 刚怀孕喝了红酒怎么办 不知道该怎么办的成语 墙纸3年了有味道怎么办 本命佛不要了怎么办 本命佛不想戴了怎么办 刚养的猫怕人怎么办 吃了马蜂蛹过敏怎么办 三星s5边框掉漆怎么办 一楼厕所反味怎么办 左脸颊反复长痘怎么办