【并查集+拓扑排序】【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[] ...
随机推荐
- 安装配置MongoDB数据库
一.关闭SElinux.配置防火墙 1.vi /etc/selinux/config #SELINUX=enforcing #注释掉 #SELINUXTYPE=targeted #注释掉 SELINU ...
- static_cast
C 风格(C-style)强制转型例如以下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这 ...
- lua编译出liblua.so
偶遇一个事情,需要在C里面嵌入Lua代码,这真是痛苦了我好久…. 不知道为啥lua默认编译没有生成.so 的动态链接库,需要修改Makefile生成liblua.so,我用的版本是5.2 一.先修改根 ...
- PHP流程控制中不经常使用的替代语法
准备做个wordpress的主题.结果看到了例如以下的语法: <div id="primary" class="content-area"> < ...
- nat网络穿透整理笔记(思维导图)
mindmanger整理的,关于Nat穿透,图片太小,可以点击放大,单独看图片.
- Android studio教程:[4]真机测试
有了Android studio这么好用的软件,自然要有一部不错的安卓手机,然后在真机上测试自己的程序,那样才能更好的发现程序中存在的问题,毕竟模拟器不是真正的手机嘛. 工具/原料 Android s ...
- 解决Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead
因为最近更新的PHP版本,写sql语句,忽然发现不能用了,上网查了一些原因,找到几个方法如下: 1.禁止php报错 display_errors = on 改成 display_errors = of ...
- 调试 JavaScript 脚本
随着 JavaScript 应用的复杂性逐渐提高,开发者需要有力的调试工具来帮助他们快速发现问题的原因,并且能高效地修复它.Chrome DevTools 提供了一系列实用的工具使得调试 JavaSc ...
- JavaScript 数组操作备忘
数组的定义: 方法1. var mycars=new Array()mycars[0]="Saab"mycars[1]="Volvo"mycars[2]=&qu ...
- Linux下源码编译安装rpy2
R(又称R语言)是一款开源的跨平台的数值统计和数值图形化展现工具.rpy2是Python直接调用R的第三方库,它可以实现使用python读取R的对象.调用R的方法以及Python与R数据结构转换等.这 ...