HDU 1811 拓扑排序 并查集
有n个成绩,给出m个分数间的相对大小关系,问是否合法,矛盾,不完全,其中即矛盾即不完全输出矛盾的。
相对大小的关系可以看成是一个指向的条件,如此一来很容易想到拓扑模型进行拓扑排序,每次检查当前入度为0的点个数是否大于1,如大于1则不完全;最终状态检查是否所有点都具有大小关系,遍历过说明有入度。但是由于“=”的存在,要考虑将指向相等数的边全部移到一个数上,故使用并查集预先将相等的点连成块,再进行拓扑排序就行了。
/** @Date : 2017-09-22 13:58:31
* @FileName: HDU 1811 拓扑排序 并查集.cpp
* @Platform: Windows
* @Author : Lweleth (SoungEarlf@gmail.com)
* @Link : https://github.com/
* @Version : $Id$
*/
#include <bits/stdc++.h>
#define LL long long
#define PII pair<int ,int>
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 2e4+20;
const double eps = 1e-8; int fa[N];
int u[N], v[N],p[N];
int deg[N];
vector<int>edg[N];
int sum = 0; int find(int x)
{
if(x != fa[x])
fa[x] = find(fa[x]);
return fa[x];
} int join(int x, int y)
{
int a = find(x);
int b = find(y);
if(a != b)
{
fa[b] = a;
sum--;
return 1;
}
return 0;
} int top(int n)
{
//priority_queue<int, vector<int>, greater<int> >q;
queue<int>q;
for(int i = 0; i < n; i++)
if(deg[i] == 0 && i == fa[i])
q.push(i);
int flag = 0;
while(!q.empty())
{
if(q.size() > 1)
flag = 1;
int nw = q.front();
q.pop();
sum--;
for(auto i : edg[nw])
{
deg[i]--;
if(deg[i] == 0)
q.push(i);
}
}
if(sum > 0)//conflict
return -1;
/*for(int i = 0; i < n; i++)
if(deg[i] > 0)
return -1;*/
if(flag)//uncertain
return 0;
return 1;
} int main()
{
int n, m;
while(~scanf("%d%d", &n, &m))
{
MMF(deg);
MMF(p);
sum = n;
for(int i = 0; i <= n; i++) fa[i] = i, edg[i].clear();
for(int i = 0; i < m; i++)
{
char t[2];
scanf("%d %s %d", u + i, t, v + i);
if(t[0] == '>')
p[i] = 1;
else if(t[0] == '<')
p[i] = -1;
else join(u[i], v[i]);
}
for(int i = 0; i < m; i++)//并掉相等的方便处理
{
if(p[i] == 1)
{
int x = find(u[i]);
int y = find(v[i]);
edg[y].PB(x);
deg[x]++;
}
else if(p[i] == -1)
{
int x = find(u[i]);
int y = find(v[i]);
edg[x].PB(y);
deg[y]++;
}
}
int ans = top(n);
if(ans == 1)
printf("OK\n");
else if(ans == -1)
printf("CONFLICT\n");
else
printf("UNCERTAIN\n");
}
return 0;
}
HDU 1811 拓扑排序 并查集的更多相关文章
- hdu 1811拓扑排序+并查集(容器实现)
http://www.cnblogs.com/newpanderking/archive/2012/10/18/2729566.html #include<stdio.h> #includ ...
- ACM: hdu 1811 Rank of Tetris - 拓扑排序-并查集-离线
hdu 1811 Rank of Tetris Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- hdu 1811 Rank of Tetris - 拓扑排序 - 并查集
自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球Tetris高手排行榜, ...
- hdu 1811(缩点+拓扑排序+并查集)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- HDU 1811 Rank of Tetris(拓扑排序+并查集)
题目链接: 传送门 Rank of Tetris Time Limit: 1000MS Memory Limit: 32768 K Description 自从Lele开发了Rating系统, ...
- 拓扑排序 - 并查集 - Rank of Tetris
Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球. 为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他将制作一个全球 ...
- LA 4255 (拓扑排序 并查集) Guess
设这个序列的前缀和为Si(0 <= i <= n),S0 = 0 每一个符号对应两个前缀和的大小关系,然后根据这个关系拓扑排序一下. 还要注意一下前缀和相等的情况,所以用一个并查集来查询. ...
- Rank of Tetris(hdu1811拓扑排序+并查集)
题意:关于Rating的信息.这些信息可能有三种情况,分别是"A > B","A = B","A < B",分别表示A的Rati ...
- Codeforces #541 (Div2) - D. Gourmet choice(拓扑排序+并查集)
Problem Codeforces #541 (Div2) - D. Gourmet choice Time Limit: 2000 mSec Problem Description Input ...
随机推荐
- c# 画一个报告
填充控件的grafics属性: private void printReportPage(object sender, System.Drawing.Printing.PrintPageEventAr ...
- 项目Beta冲刺(团队)第二天
1.昨天的困难 夜间模式实现的时候一点击开关就会出现app黑屏卡死的状态,recreate()方法实现有问题 服务器有点问题 2.今天解决的进度 成员 进度 陈家权 研究如何实现私信模块 赖晓连 最新 ...
- HDU 5465 Clarke and puzzle Nim游戏+二维树状数组
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle Accepts: 42 Submissions: 26 ...
- Java实现的词频统计——Web迁移
本次将原本控制台工程迁移到了web工程上,依旧保留原本控制台的版本. 需求: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件: 2.在页面上给出链接 (如果有封皮.作者.字数.页数等信息 ...
- Struts2拦截器配置和使用
拦截器是Struts2最强大的特性之一,它是一种可以让用户在Action执行之前和Result执行之后进行一些功能处理的机制. 说到拦截器interceptor,就会想到过滤器filter: 过滤器f ...
- Android自动化 -- sendevent/getevent 用法
getevent&sendevent 是android系统下的一个工具,可以 模拟 多种按键和触屏操作,产生的是raw event,raw event经过event hub处理产生最终的ges ...
- 第117天:Ajax实现省市区三级联动
Ajax实现省市区三级联动 思路: (1)首先获取省份信息 (2)发起Ajax请求,注意dataType中的T大写 (3)封装回调函数,回调函数success中用$.each循环每一条数据,动态创建o ...
- 第93天:CSS3 中边框详解
CSS3 边框详解 其中边框圆角.边框阴影属性,应用十分广泛,兼容性也相对较好,具有符合渐进增强原则的特征,我们需要重点掌握. 一.边框圆角 border-radius 每个角可以设置两个值 ...
- java 类型转型
- hdfs源码分析第一弹
1. hdfs定义 HDFS is the primary distributed storage used by Hadoop applications. A HDFS cluster primar ...