【并查集+拓扑排序】【HDU1811】【Rank of Tetris】
题意:给你3种关系 A=B,A>B,A<B 问是否排名方式唯一,或者存在矛盾
解
1.读入数据先处理 =号 用并查集的祖先作为代表元素,其他儿子节点都等于跟这个点重叠。 再读入 ‘<’ ‘>’ 来建图进行拓扑排序
2.将所有入度为0的点加入队列,再从队列中取出一个点,对其所连的边的入度进行-1,如果使入度=0则加入队列,直至队列为空
3.如果进入队列的点
小于 总点数(非N,N-重点) 则有矛盾
如果有队列中元素>=2的时刻
则证明不存在唯一的排名方式
其余
OK;
代码如下:
/*
WA1 调试数据
2 2
0 = 1
0 = 1
错误输出 CONFLIET
正确输出 OK 错误原因 if(tot<N) printf("CONFLICT\n"); 忘记了重点(合并的点),所以总共要遍历的点少于N
*/
//Warning 虽然这里没必要 不过还是要的记得清空队列
//结果 Run ID Submit Time Judge Status Pro.ID Exe.Time Exe.Memory Code Len. Language Author
//结果 13306745 2015-03-31 21:40:45 Accepted 1811 31MS 1972K 2378 B C++ ZHOU #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include<queue>
#define oo 0x13131313
const int maxn=10005;
int N,M; struct fa
{
int a,b;
char c;
};
fa A[4*maxn];
struct Edge{
int to;
Edge *next;
};
struct Node{
int num;
Edge *first;
};
Edge E[maxn*4],*EE=E+1;
Node Graph[maxn];
int father[maxn];
using namespace std;
int find(int x)
{
if(x!=father[x])
father[x]=find(father[x]);
return father[x];
}
void Union(int a,int b)
{
int aa=find(a),bb=find(b);
if(aa!=bb) father[aa]=bb;
}
void init()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
}
void Link(int u,int v)
{
EE->to=v,EE->next=Graph[u].first,Graph[u].first=EE++;
Graph[v].num++;
}
void CLEAR()
{
memset(Graph,0,sizeof(Graph));
EE=E+1;
for(int i=0;i<=maxn-1;i++)
father[i]=i;
}
void input()
{
CLEAR();
for(int i=1;i<=M;i++)
{
scanf("%d %c %d\n",&A[i].a,&A[i].c,&A[i].b);
if(A[i].c=='=') Union(A[i].a,A[i].b);
}
for(int i=1;i<=M;i++)
{
if(A[i].c=='<') Link(find(A[i].a),find(A[i].b));
else if(A[i].c=='>') Link(find(A[i].b),find(A[i].a));
}
}
void solve()
{ int ok=1;
int tot=0;
int kk=0;
queue <int> Q;
while(!Q.empty()) Q.pop();
for(int i=0;i<N;i++)
if(father[i]==i)
{
kk++;
if(Graph[i].num==0)
Q.push(i);
}
while(!Q.empty())
{
if(Q.size()>=2) ok=0;
int t=Q.front();Q.pop();tot++;
for(Edge *p=Graph[t].first;p;p=p->next)
{
Graph[p->to].num--;
if(Graph[p->to].num==0) Q.push(p->to);
}
} if(tot<kk) printf("CONFLICT\n");
else if(ok==0) printf("UNCERTAIN\n");
else printf("OK\n");
}
int main()
{
// init();
while(cin>>N>>M)
{
input();
solve();
}
return 0;
}
【并查集+拓扑排序】【HDU1811】【Rank of Tetris】的更多相关文章
- HDU 1811:Rank of Tetris(并查集+拓扑排序)
http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description 自从Lele开发了Rating系 ...
- 并查集+拓扑排序 赛码 1009 Exploration
题目传送门 /* 题意:无向图和有向图的混合图判环: 官方题解:首先对于所有的无向边,我们使用并查集将两边的点并起来,若一条边未合并之前, 两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为 ...
- hdu1811 Rank of Tetris 并查集+拓扑排序
#include <stdio.h> #include <string.h> #include <vector> #include <queue> us ...
- HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU1811 并查集+拓扑排序
题目大意: 判断是否能根据给定的规则将这一串数字准确排序出来 我们用小的数指向大的数 对于相等的情况下,将二者合并到同一个并查集中,最后抽象出来的图上面的每一个点都应该代表并查集的标号 #includ ...
- hdu 1811 Rank of Tetris (并查集+拓扑排序)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 1811Rank of Tetris (并查集 + 拓扑排序)
/* 题意:这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B,等于B ...
- Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)
D. Gourmet choice 链接:http://codeforces.com/contest/1131/problem/D 思路: = 的情况我们用并查集把他们扔到一个集合,然后根据 > ...
- Codeforces Round #541 (Div. 2) D 并查集 + 拓扑排序
https://codeforces.com/contest/1131/problem/D 题意 给你一个n*m二维偏序表,代表x[i]和y[j]的大小关系,根据表构造大小分别为n,m的x[],y[] ...
随机推荐
- svn local delete, incoming delete upon update 解决办法
经常有人会说,树冲突是很难解决的一类冲突,其实一旦了解了其原理,要解决也不难.先回顾下对于树冲突的定义. 树冲突:当一名开发人员移动.重命名.删除一个文件或文件夹,而另一名开发人员也对它们进行 ...
- 64bit ubuntu14.04编译PlatinumKit出现的arm-linux-androideabi-g++: not found错误解决方法
编译命令:scons target=arm-android-linux build_config=Release 出现错误: scons: Reading SConscript files ...** ...
- 【TFS】增加组员,以及用户权限分配
一.创建windows用户. 二.TFS ->组成员资格->双击 项目集合管理员->添加创建的Windows用户(最高权限) 三.设置权限: TFS权限的复杂,其实也不是很复杂,它只 ...
- 动态分配内存补充 realloc
当再次在原来申请的内存基础上再加内存的时候用realloc,如果第一次分配的内存后面存储地方够用,则连着原来的申请,如果不够用,就重新找到一块够用的地方,然后把原来的复制过去 int main(int ...
- HDU 5730 - Shell Necklace
题意: 给出连续的1-n个珠子的涂色方法 a[i](1<=i<=n), 问长度为n的珠链共有多少种涂色方案 分析: 可以得到DP方程: DP[n] = ∑(i=1,n) (DP[n-i]* ...
- [原创]Windows下Google V8 javascript引擎编译
项目用到将v8嵌入到C++的情况,公司没时间研究,只有在家研究,编译过程一堆坑.记录一下. 网上百度的都是基于vs2010,或者早版本的v8编译,最新版本应该使用vs2013\vs2015.本文介绍的 ...
- Linux程序设计 读笔3 文件操作
一 linux文件结构 二 系统调用和设备驱动程序 三 库函数 四 底层文件访问 五 标准IO库 六 格式化输入输出 七 文件和目录的维护 八 扫描目录 九 错误处理 十
- phpstorm8 配置svn
步骤1 步骤2. 步骤3.
- Android应用截图嵌入到真实设备
Device Art Generator 你可以使用 Device Art Generator 方便快捷地将应用截图嵌入到真实设备的效果图中.这样,当用户在你的网站上或其他宣传材料中看到你的应用截图时 ...
- JVM虚拟机选项:Xms Xmx PermSize MaxPermSize区别
java虽然是自动回收内存,但是应用程序,尤其服务器程序最好根据业务情况指明内存分配限制.否则可能导致应用程序宕掉. 举例说明含义:-Xms128m 表示JVM Heap(堆内存)最小尺寸128MB, ...