hdu 1811 Rank of Tetris 并查集+拓扑排序
链接:http://acm.hdu.edu.cn/showproblem.php?
pid=1811
Rank of Tetris
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6539 Accepted Submission(s): 1845
为了更好的符合那些爱好者的喜好,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"。
每组測试第一行包括两个整数N,M(0<=N<=10000,0<=M<=20000),分别表示要排名的人数以及得到的关系数。
接下来有M行,分别表示这些关系
做法:把等于的用并查集放一起,找出最小的数,也就是入度为零的数。然后開始拓扑,拓扑就是每次把入度为0,也就是剩下点中最小的数拿来,再把它的上一个入度减掉。
假设有点没訪问,就是说明有环,说明矛盾。
假设队列同一时候有两个点在,说明这两个点大小关系不明,不明白。
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
int f[10010];int find(int x){return x==f[x]?x:f[x] = find(f[x]);} //初始化为自己
void Union(int x, int y){int fx = find(x), fy = find(y);if(fx == fy)return ;if(fx>fy) swap(fx,fy);f[fx] = f[x] = f[y] = fy;//这样 就能够直接查f[i] 推断祖先了
}int num[20010][2];
int bi[20010];
vector <int>vec[10010];int du[10010];
int main()
{int T;int n,m,nn,mm;char a; while(scanf("%d%d",&n,&m)!=EOF){ for(int i=1;i<=n;i++){f[i]=i;vec[i].clear();du[i]=0;//入度 为0 说明是最小的}for(int j=0; j<m; j++){ scanf("%d %c %d",&num[j][0],&a,&num[j][1]);num[j][0]++;num[j][1]++;if(a=='>'){bi[j]=1; }else if(a=='='){Union(num[j][0],num[j][1]);bi[j]=0;}else{bi[j]=-1; }}for(int j=0;j<m;j++){if(bi[j]==1){du[find(num[j][0])]++;vec[find(num[j][1])].push_back(num[j][0]);}else if(bi[j]==-1){du[find(num[j][1])]++;vec[find(num[j][0])].push_back(num[j][1]);}}int numb=0;int sum=0;queue<int>q;while(!q.empty())q.pop();for(int i=1;i<=n;i++)//開始最小的{if(find(i)==i)sum++;if(du[find(i)]==0){q.push(find(i));du[find(i)]=-1;//表示已经訪问过了,numb++;}}int flag=0;if(q.size()>1)//假设有两个同一时候入队 说明两者之间没有大小关系 不明白flag=1;while(!q.empty()){int tt=q.front();q.pop();tt=find(tt); for(int i=0;i<vec[tt].size();i++){int dian=find(vec[tt][i]);du[dian]--; if(du[dian]==0){q.push(dian);du[dian]=-1;numb++;}} if(q.size()>1)flag=1;}if(numb<sum)//假设有没訪问过的点 就是有自环。说明矛盾flag|=2;if(flag==0)puts("OK");else if(flag==1)puts("UNCERTAIN");else if(flag==2)puts("CONFLICT");else puts("CONFLICT");}return 0;
}
hdu 1811 Rank of Tetris 并查集+拓扑排序相关推荐
- hdu 1811 Rank of Tetris (并查集+拓扑排序)
Problem - 1811 感觉这题的并查集以及拓扑排序并不难,但是做题的时候必须理解到矛盾(CONFLICT)与不确定(UNCERTAIN)直接的优先关系. 做这题的时候,构图什么的很简单,就是没 ...
- HDU - 1811 Rank of Tetris 并查集 + 拓扑序 +me
link 题意: 首先看到排名自然想到拓扑序,但是存在等于的情况,这就启发我们把等于的情况缩成一个点,让后在缩点后的图中进行拓扑即可. 对于不合法的情况当然是拓扑序没有遍历到应该遍历的点,所以只需要检 ...
- hdu 1811Rank of Tetris (并查集 + 拓扑排序)
1 /* 2 题意:这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B ...
- HDU 1811 Rank of Tetris(并查集按秩合并+拓扑排序)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 1811 Rank of Tetris
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU——1272小希的迷宫(并查集+拓扑排序)
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- hdu5222 Exploration【并查集+拓扑排序】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5222 题意:有一个探险家,探险一个地方,这个地方有n个洞穴,有若干条边,有的边是有向边,有的是无向边, ...
- Mr. Kitayuta‘s Technology CodeForces - 505D(并查集+拓扑排序或dfs找环) 题解
题目 Shuseki Kingdom is the world's leading nation for innovation and technology. There are n cities ...
- 家谱树 (并查集拓扑排序)
目录 拓扑排序 Kahn. 最后附上Kahn的代码: 链式前向星做法: 其次是我用Kahn做的家谱树的代码(矩阵): 其次是我用Kahn做的家谱树的代码(链式前向星): [题目描述] 有个人的家族很大 ...
- HDOJ 1811 Rank of Tetris
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
最新文章
- 使用DDMS抓取安卓APP的奔溃日志
- lintcode:删除链表中指定元素
- Spring学习总结3——配置datasource三种方式
- 美团疯狂地推共享充电宝,使出杀手锏!商家:我们不敢不用
- 软件开发中的成本意识
- jspstudy启动mysql失败_JspStudy配置Jspxcms安装教程,以及数据库设置;
- 计算机无法启动bios,笔记本进不了bios的解决方法
- XSS进阶一 ——合天网安实验室学习笔记
- linux c 获取usb vid,Linux如何使用libudev获取USB设备VID及PID
- 对于拉格朗日乘数法的个人理解
- iOS appIcon生成和设置
- 微信防撤回python_python实现微信防撤回神器
- 欧氏空间距离和内积_欧式空间、内积空间和赋范空间之间的关系
- 中鑫吉鼎|白领投资理财有哪些注意事项
- Win10下如何修改系统用户目录名称
- 数据结构与算法(十一)Trie字典树
- OCR最佳实践项目汇总
- NAT 模式下网关设置
- 六十星系之11紫微破军坐丑未
- 量子计算 18 量子算法3 (RSA Shor)
热门文章
- 【观点讨论与支撑】明星和成功人士真的就只有成功的一面吗?背后的心酸和痛苦的经历我感觉更重要!
- 页面置换算法(FIFO、LRU、LFU)c++实现
- 国内外网站服务器研究现状,国内地学科普网站现状研究
- 题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
- 大学mysql期末试题_大学期末考试综合实训试题一
- request.setAttribute()怎么用的?
- mysql server 6.0_MySQL Server 6.0完全卸载以及卸载中遇到的问题
- 打包的时候不把配置文件加进去_苹果软件打包签名原理
- python爬取数据库数据类型_python中从搭建Mysql平台到爬取数据一站式全部完成
- css3中插入地图,CSS3 地图展开动画