HDU1811 并查集+拓扑排序
题目大意:
判断是否能根据给定的规则将这一串数字准确排序出来
我们用小的数指向大的数
对于相等的情况下,将二者合并到同一个并查集中,最后抽象出来的图上面的每一个点都应该代表并查集的标号
#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 并查集+拓扑排序的更多相关文章
- 并查集+拓扑排序 赛码 1009 Exploration
题目传送门 /* 题意:无向图和有向图的混合图判环: 官方题解:首先对于所有的无向边,我们使用并查集将两边的点并起来,若一条边未合并之前, 两端的点已经处于同一个集合了,那么说明必定存在可行的环(因为 ...
- HDU 1811:Rank of Tetris(并查集+拓扑排序)
http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description 自从Lele开发了Rating系 ...
- 【并查集+拓扑排序】【HDU1811】【Rank of Tetris】
题意:给你3种关系 A=B,A>B,A<B 问是否排名方式唯一,或者存在矛盾 解 1.读入数据先处理 =号 用并查集的祖先作为代表元素,其他儿子节点都等于跟这个点重叠. 再读入 '< ...
- hdu1811 Rank of Tetris 并查集+拓扑排序
#include <stdio.h> #include <string.h> #include <vector> #include <queue> us ...
- hdu 1811Rank of Tetris (并查集 + 拓扑排序)
/* 题意:这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rating高于B,等于B ...
- hdu1811 并查集+拓扑序
题意:现在有一个排名系统,有一系列信息,分别是 > < = 的比较,而如果最终相等,就会将这些相等的按照序号从小到大排,问给出的信息是否可以确定完整的排序. 由于如果很多点相等,他们肯定能 ...
- 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[] ...
- HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
随机推荐
- 题解报告:hdu 1261 字串数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1261 Problem Description 一个A和两个B一共可以组成三种字符串:"ABB ...
- JAVA中abstract,interface,final,static语法
转自:http://www.cnblogs.com/yueue/archive/2010/04/20/1715863.html 一,抽象类:abstract 1,只要有一个或一个以上抽象方法的 ...
- F 点与多边形 数学 + 观察
https://biancheng.love/contest-ng/index.html#/123/problems 做题要在纸上弄弄,才会有发现. 发现到答案只是-1和4,因为坐标都是整数. 然后就 ...
- MAT使用入门
原文出处: 高建武 (Granker,@高爷) MAT简介 MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具, ...
- Repeater 的使用
<HeaderTemplate></HeaderTemplate> 头模板——在加载开始执行一遍 <FooterTemplate></FooterTempl ...
- jsp中提示修改成功
修改成功提示 servert包 request.setAttribute("success", "修改失败"); 效果而 function f(){ var n ...
- AJPFX关于增强for的概述和使用(foreach)
增强for的概述和使用(foreach)1.增强for的概述和使用(foreach) 格式: for(数组或者Collection集合中元素 ...
- swiper4实现的拥有header和footer的全屏滚动demo/swiper fullpage footer
用swiper4实现的拥有header和footer的全屏滚动demo, <!DOCTYPE html> <html lang="en"> <head ...
- ES6学习笔记(1)----let和const命令
参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ let和const命令 let 总结1.声明变量基本使用方法与var 相同 不同点 a.在代 ...
- java设计模式之代理模式 ,以及和java 回调机制的区别
java 代理模式就是: 将自己要做的事交给别人去做(这个别人就是代理者,自己就是被代理者),为什么自己能做的要交给别人去做了?假如一个小学生小明,现在要写作业,但是又想玩游戏,他更想玩游戏,并且不想 ...