【HDOJ1811】【并查集预处理+拓扑排序】
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): 11382 Accepted Submission(s): 3261
为了更好的符合那些爱好者的喜好,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 > 1
1 < 2
0 > 2
4 4
1 = 2
1 > 3
2 > 0
0 > 1
3 3
1 > 0
1 > 2
2 < 1
CONFLICT
UNCERTAIN
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int>pq;
struct edge{
int to;
int next;
}EDGE[];
struct pot{
int to1;
int to2;
char ch;
}POT[];
int cnt=;
int flag;
int in[],head[],pre[],vis[],vviss[],vvis[],out[];
int n,m,N;
void add(int x,int y)
{
in[y]++;
out[x]++;
EDGE[cnt].to=y;
EDGE[cnt].next=head[x];
head[x]=cnt++;
}
int orz1=,orz2=;
int find(int x)
{
int xx=x;
while(x!=pre[x])
{
x=pre[x];
}
while(pre[xx]!=x)
{
int t=pre[xx];
pre[xx]=x;
xx=t;
}
return x;
}
void Topsort()
{
int wqw=;
for(int i = ; i < N ; i++)
{
if(!in[find(i)]&&!vis[find(i)])
{
wqw++;
orz2++;
vis[find(i)]=;
pq.push(find(i));
}
}
if(wqw>)flag=;
while(!pq.empty())
{
int qwq=pq.front();pq.pop();
for(int i = head[qwq];i != - ; i=EDGE[i].next)
{
int v=EDGE[i].to;
in[v]--;
if(!in[v])
{
orz2++;
pq.push(v);
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)==)
{
N=n;
orz1=;orz2=;
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis));
memset(vvis,,sizeof(vvis));
memset(vviss,,sizeof(vviss));
memset(in,,sizeof(in));
memset(out,,sizeof(out));
for(int i = ; i < n ; i++)pre[i]=i;
for(int i = ; i < m; i++)
{
int a,c;
char b;
scanf("%d %c %d",&POT[i].to1,&POT[i].ch,&POT[i].to2);
if(POT[i].ch=='=')
{
if(find(POT[i].to1)!=find(POT[i].to2))
{
pre[find(POT[i].to1)]=find(POT[i].to2);
n--;
}
// vviss[find(POT[i].to2)]=1;
}
}
flag=;
for(int i = ; i < m ; i++)
{
if(POT[i].ch=='=')
continue;
char b=POT[i].ch;
int a=find(POT[i].to1);
int c=find(POT[i].to2);
if(a!=c)
{
if(b=='>')
add(a,c);
else if(b=='<')
add(c,a); }
else
flag=;
}
int qwq=;
if(flag!=)
{
for(int i = ; i < N ; i++)
{
if(!out[find(i)]&&!vvis[find(i)])
{
vvis[find(i)]=;
qwq++;
if(qwq>){
flag=;
break;}
}
}
Topsort();
if(orz2<n)flag=;
}
if(flag==)printf("UNCERTAIN\n");
else if(flag==)printf("CONFLICT\n");
else printf("OK\n");
} return ;
}
【HDOJ1811】【并查集预处理+拓扑排序】的更多相关文章
- [HDOJ1811]Rank of Tetris(并查集、拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1811 求一堆数据的拓扑序. 处理:x>y就是x到y一条边,x<y就是y到x一条边.关键问题 ...
- CF1131D Gourmet choice(并查集,拓扑排序)
这题CF给的难度是2000,但我感觉没这么高啊…… 题目链接:CF原网 题目大意:有两个正整数序列 $a,b$,长度分别为 $n,m$.给出所有 $a_i$ 和 $b_j(1\le i\le n,1\ ...
- HDU 1811 并查集+拓扑排序
Rank of Tetris 题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1811 Problem Description 自从Lele开发了Rati ...
- 【BZOJ2200】道路和航线(并查集,拓扑排序,最短路)
题意:n个点,有m1条双向边,m2条单向边,双向边边长非负,单向边可能为负 保证如果有一条从x到y的单项边,则不可能存在从y到x的路径 问从S出发到其他所有点的最短路 n<=25000,n1,m ...
- hdu1811 并查集+拓扑序
题意:现在有一个排名系统,有一系列信息,分别是 > < = 的比较,而如果最终相等,就会将这些相等的按照序号从小到大排,问给出的信息是否可以确定完整的排序. 由于如果很多点相等,他们肯定能 ...
- POJ3687拓扑排序+贪心
题意: 给你n个求,他们的重量是1-n(并不是说1号求的重量是1...),然后给你m组关系a,b,表示a的重量小于b的重量,然后让你输出满足要求的前提下每个球的重量,要求字典序最小. 思路 ...
- hdu4324 Triangle LOVE (拓扑排序)
这是一道最简单的拓扑排序题,好久没看这个算法了! 有点生疏了! 后附上百度的资料; #include<stdio.h> #include<string.h> int in[50 ...
- hdu 5652 India and China Origins(二分+bfs || 并查集)BestCoder Round #77 (div.2)
题意: 给一个n*m的矩阵作为地图,0为通路,1为阻碍.只能向上下左右四个方向走.每一年会在一个通路上长出一个阻碍,求第几年最上面一行与最下面一行会被隔开. 输入: 首行一个整数t,表示共有t组数据. ...
- 并查集【p2700】逐个击破
题目描述-->p2700 逐个击破 题意概括 花费最小的代价,使得一些有标记的节点不连通. 分析 我们需要花费最小代价使得原来连通的图中一些节点之间不相互连通. 贪心显然是可行的(一点也不显然 ...
随机推荐
- PHP中的Trait方法
<?php /* * 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. * Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制. * Trait ...
- 二叉树实现,C++语言描述
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- JVM运行时内存区域
JVM运行java程序时会将内存划分为若干个不同的数据区域: (1)程序计数器: 1.占用内存空间不大. 2.程序计数器相当于JVM所执行的字节码(jvm指令)的“行号指示器”,通过程序计数器的“值” ...
- python笔记3-输出输入、字符串格式化
输入.输出 python怎么来接收用户输入呢,使用input函数,python2中使用raw_input,接收的是一个字符串,输出呢,第一个程序已经写的使用print,代码入下: 1 2 name=i ...
- Android开发---基本UI组件1:自动拨电话,自动上网,输入框不换行、只输数字、只输文本、只输密码
1.activity_main.xml 描述:构建一个按钮 <?xml version="1.0" encoding="utf-8"?> <L ...
- U盘如何去除写保护
用一个简单而粗暴的方法去除U盘写保护: www.upantool.com/hfxf/xiufu//FormatTool.html#softdown 没有比这个更牛的软件了.
- 强化学习9-Deep Q Learning
之前讲到Sarsa和Q Learning都不太适合解决大规模问题,为什么呢? 因为传统的强化学习都有一张Q表,这张Q表记录了每个状态下,每个动作的q值,但是现实问题往往极其复杂,其状态非常多,甚至是连 ...
- Code First 迁移更新数据库
在使用 Code First 方式进行MVC程序设计中,更新数据库操作记录: 1.修改需要更新的Model,将应用程序重新编译 2.选择工具>库程序包管理器>程序包管理控制台,打开控制台, ...
- Android:如何获取屏幕的宽高
WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); DisplayMet ...
- ionic的actionsheet安卓样式不正常的坑及解决之道
这是actionsheet该有的样子,可是android下变成了这样: 百度后,发现修改lonic.css,注释这段代码就可以了: