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 ...
随机推荐
- C#DataTable学习心得[转]
一.DataSet.DataTable.DataRow.DataColumn 1] 在DataSet中添加DataTable DataSet.Tables.Add(DataTable) 实例: Dat ...
- 转 PHP Cookies
cookie 常用于识别用户. 什么是 Cookie? cookie 常用于识别用户.cookie 是服务器留在用户计算机中的小文件.每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie. ...
- jmeter(一)工具介绍(二)
1.Jmeter 概要描叙 jmeter 是一款专门用于功能测试和压力测试的轻量级测试开发平台.多数情况下是用作压力测试,该测试工具在阿里巴巴有着广泛的使用,估计是不要钱吧,哈哈,功能上来说,整个平台 ...
- 获取select里面option所有的值
1.HTML结构 <select id="test"> <option value="option-1">option-1</op ...
- 关于如何读取XML文件的一个简单方法
在平时开发系统功能的时候,我们经常会碰到一些需求需要经常性的发生变化,比如 系统版本.更新日志 等等.这个时候用一个XML文件来替代数据库,就会变的简便很多. 前段时候我也正好需要改个需求,是关于客户 ...
- 【转】qqface使用实例
原网址:http://www.xwcms.net/js/bddm/51565.html <div id="show"></div> <div cl ...
- sh/bash/csh/Tcsh/ksh/pdksh等shell本质区别
sh/bash/csh/Tcsh/ksh/pdksh等shell本质区别 1. Shell脚本的书写 在写Shell脚本时,往往第一行要注明用什么解释器来解释这个脚本. 如#!/bin/bash即用/ ...
- 自制无线共享工具C++源代码及创建过程
// wire.cpp : 定义控制台应用程序的入口点.// #include <iostream>#include <string.h>using namespace std ...
- iOS UI 顶级布局
状态栏. 导航栏. tabbar. uiviewcontroller视图区域.
- 【转】Web 前沿——HTML5 Form Data 对象的使用
XMLHttpRequest Level 2 添加了一个新的接口——FormData.利用 FormData 对象,我们可以通过 JavaScript 用一些键值对来模拟一系列表单控件,我们还可以使用 ...