题目大意:

判断是否能根据给定的规则将这一串数字准确排序出来

我们用小的数指向大的数

对于相等的情况下,将二者合并到同一个并查集中,最后抽象出来的图上面的每一个点都应该代表并查集的标号

 #include <cstdio>
#include <cstring>
#include <stack>
#include <iostream>
using namespace std; #define N 10005
char s[N<<][];
int fa[N] , first[N] , in[N] , k , cnt;//fa[i]保存的是i点处于的并查集号,cnt记录最后剩下的并查集数
bool vis[N];//判断对应下标的集合是否会进入最后生成的图中
struct Edge{
int y,next;
}e[N<<]; void add_edge(int x,int y)
{
in[y]++;
e[k].y = y , e[k].next=first[x];
first[x] = k++;
} void init(int n)
{ k=;
memset(first , - , sizeof(first));
memset(in,,sizeof(in));
for(int i=;i<n;i++)
fa[i] = i , vis[i] = true;
} int find_fa(int x)
{
while(x!=fa[x])
x=fa[x];
return x;
} void Union(int a , int b)
{
int fa1_set = find_fa(a);
int fa2_set = find_fa(b);
if(fa1_set != fa2_set)
{
fa[fa2_set] = fa1_set , cnt--;
vis[fa2_set] = false; //fa2_set集合被合并,所以最后不会进入图中,所以将其舍去
}
} int tuopu(int n)
{
stack<int> s;
for(int i = ; i<n ; i++){
if(vis[i] && !in[i]) s.push(i);
}
int flag = ;
for(int i= ; i<cnt ; i++){
if(s.empty()) return -;
if(s.size() > ) flag = ;
int u = s.top();
s.pop();
for(int j=first[u] ; j!=- ; j=e[j].next){
int v = e[j].y;
in[v]--;
if(!in[v]){
s.push(v);
}
}
}
if(!flag) return ;
return ;
} int main()
{
// freopen("a.in" , "rb" ,stdin);
int n , m , a[N] , b[N];
while(scanf("%d%d",&n,&m)!=EOF)
{
init(n);
cnt = n; for(int i=;i<m;i++){
scanf("%d%s%d",&a[i],s[i],&b[i]);
if(s[i][] == '='){
Union(a[i],b[i]);
}
}
//cout<<"cnt: "<<cnt<<endl;
for(int i = ; i<m ; i++){
int fa1 = find_fa(a[i]);
int fa2 = find_fa(b[i]);
if(s[i][] == '<'){
add_edge(fa1 , fa2);
}
else if(s[i][] == '>'){
add_edge(fa2 , fa1);
}
}
int flag = tuopu(n);
if(flag == ) puts("OK");
if(flag == -) puts("CONFLICT");
if(flag == ) puts("UNCERTAIN");
}
return ;
}

HDU1811 并查集+拓扑排序的更多相关文章

  1. 并查集+拓扑排序 赛码 1009 Exploration

    题目传送门 /* 题意:无向图和有向图的混合图判环: 官方题解:首先对于所有的无向边,我们使用并查集将两边的点并起来,若一条边未合并之前, 两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为 ...

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

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description   自从Lele开发了Rating系 ...

  3. 【并查集+拓扑排序】【HDU1811】【Rank of Tetris】

    题意:给你3种关系 A=B,A>B,A<B 问是否排名方式唯一,或者存在矛盾 解 1.读入数据先处理 =号 用并查集的祖先作为代表元素,其他儿子节点都等于跟这个点重叠. 再读入 '< ...

  4. hdu1811 Rank of Tetris 并查集+拓扑排序

    #include <stdio.h> #include <string.h> #include <vector> #include <queue> us ...

  5. hdu 1811Rank of Tetris (并查集 + 拓扑排序)

    /* 题意:这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B,等于B ...

  6. hdu1811 并查集+拓扑序

    题意:现在有一个排名系统,有一系列信息,分别是 > < = 的比较,而如果最终相等,就会将这些相等的按照序号从小到大排,问给出的信息是否可以确定完整的排序. 由于如果很多点相等,他们肯定能 ...

  7. Codeforces Round #541 (Div. 2) D(并查集+拓扑排序) F (并查集)

    D. Gourmet choice 链接:http://codeforces.com/contest/1131/problem/D 思路: =  的情况我们用并查集把他们扔到一个集合,然后根据 > ...

  8. Codeforces Round #541 (Div. 2) D 并查集 + 拓扑排序

    https://codeforces.com/contest/1131/problem/D 题意 给你一个n*m二维偏序表,代表x[i]和y[j]的大小关系,根据表构造大小分别为n,m的x[],y[] ...

  9. HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)

    Rank of Tetris Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. 模拟 hihoCoder 1177 顺子

    题目传送门 /* 模拟:简单的照着规则做就可以了,把各种情况考虑到,虽然比赛写的丑了点,但能1Y还是很开心的:) */ #include <cstdio> #include <cst ...

  2. 题解报告:hdu 2057 A + B Again

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2057 问题描述 我们的HDOJ必须有许多A + B问题,现在又有新的问题出现. 给你两个十六进制整数, ...

  3. oracle如何实现函数、包、存储过程加密

    首先创建一个名称为test1.sql的文件: CREATE OR REPLACE FUNCTION get_date_string RETURN VARCHAR2 AS BEGIN RETURN TO ...

  4. APP增量更新

    增量更新的概念: 当我们手机上安装的app版本与服务器的最新版本不一致的时候,传统做法是重新下载安装一个最新版的apk文件,不过这种方式比较耗流量,不利于用户体验.增量更新就是只下载当前app版本与最 ...

  5. hdu3436Queue-jumpers(线段树)

    链接 这题最不好求的一部分是rank部分 因为top每次都是把一个数放在队头 不会穿插在数组里 也就是说后面没有top过的一部分数 依旧保持有序 这样可以分为两部分来处理 比如 1 2 3 4 5 6 ...

  6. A8通用权限框架

  7. hihocoder 分隔相同字符

    思路: 枚举,贪心. 在“合法”的前提下放置越排在前边的字母越好. “合法”:'a' - 'z'中没有一个字母的个数超过当前串剩余长度的一半(偶数情况下)或长度的一半加1(奇数情况下). 实现: #i ...

  8. 微信小程序组件解读和分析:十、input输入框

    input输入框组件说明: 本文介绍input 输入框的各种参数及特性. input输入框示例代码运行效果如下: 下面是WXML代码: [XML] 纯文本查看 复制代码 ? 01 02 03 04 0 ...

  9. 机器学习-牛顿方法&指数分布族&GLM

    本节内容 牛顿方法 指数分布族 广义线性模型 之前学习了梯度下降方法,关于梯度下降(gradient descent),这里简单的回顾下[参考感知机学习部分提到的梯度下降(gradient desce ...

  10. iOS :Object-C 语言merge两个字典对象

    Object-C 语言merge两个字典对象 - (id)mutableDictionaryCopyIfNeeded:(id)dictObj { if ([dictObj isKindOfClass: ...