hdu1811 Rank of Tetris 并查集+拓扑排序
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
struct node//边
{
int a, b;//顶点
char ch;//运算符
}c[];
vector<int>map[];//map数组存贮邻接表 (大佬都是这么开数组的)
int n, m, sum, in[], fa[];//in数组表示入度,fa[i]表示顶点i所在集合的根节点 int find(int x)//查找根节点
{
if (fa[x] != x) fa[x] = find(fa[x]);
return fa[x];
} bool comb(int x, int y)//合并集合
{
x = find(x);
y = find(y);
if (x == y)
return false;
else
{
fa[y] = x;
return true;
}
} void init()//初始化
{
for (int i = ; i<n; i++)
fa[i] = i;
} void top_sort()//queue实现拓扑排序
{
queue<int>s;
int flag = ;
for (int i = ; i<n; i++)
{
//找到入度为零的切祖宗为自己的加入到队列中
if (in[i] == && fa[i] == i)
s.push(i);
}
while (!s.empty())
{
if (s.size() > )//即使发现信息不完整也要继续运行下去,因为如果信息同时不完整和冲突都是CONFLICT
flag = ;
int pos = s.front();
s.pop(), sum--; //记录下运行的次数
for (int i = ; i<map[pos].size(); i++)
{
in[map[pos][i]]--;
if (in[map[pos][i]] == )
s.push(map[pos][i]);
}
}
if (sum>) printf("CONFLICT\n"); //冲突,即有多个入度为零且祖宗为自己的出现
else if (flag) printf("UNCERTAIN\n");
else printf("OK\n");
} int main()
{
while (scanf("%d %d", &n, &m) != EOF)
{
sum = n;
init();
memset(map, , sizeof(map));
memset(in, , sizeof(in));
for (int i = ; i<m; i++)
{
scanf("%d %c %d", &c[i].a, &c[i].ch, &c[i].b);
//如果相等,就合并为同一个集合
if (c[i].ch == '=')
{
if (comb(c[i].a, c[i].b))
sum--;
}
}
for (int i = ; i<m; i++)
{
if (c[i].ch == '=')
continue;
int x = find(c[i].a);
int y = find(c[i].b);
if (c[i].ch == '>')
{
map[x].push_back(y);
in[y]++;
}
else
{
map[y].push_back(x);
in[x]++;
}
}
top_sort();
}
//system("pause");
return ;
}
hdu1811 Rank of Tetris 并查集+拓扑排序的更多相关文章
- 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 ...
- 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】
题意:给你3种关系 A=B,A>B,A<B 问是否排名方式唯一,或者存在矛盾 解 1.读入数据先处理 =号 用并查集的祖先作为代表元素,其他儿子节点都等于跟这个点重叠. 再读入 '< ...
- HDU 1811 Rank of Tetris(并查集+拓扑排序 非常经典)
Rank of Tetris Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- [HDOJ1811]Rank of Tetris(并查集、拓扑排序)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1811 求一堆数据的拓扑序. 处理:x>y就是x到y一条边,x<y就是y到x一条边.关键问题 ...
- HDU1811 并查集+拓扑排序
题目大意: 判断是否能根据给定的规则将这一串数字准确排序出来 我们用小的数指向大的数 对于相等的情况下,将二者合并到同一个并查集中,最后抽象出来的图上面的每一个点都应该代表并查集的标号 #includ ...
- HDU 1811(并查集+拓扑排序)题解
Problem Description 自从Lele开发了Rating系统,他的Tetris事业更是如虎添翼,不久他遍把这个游戏推向了全球.为了更好的符合那些爱好者的喜好,Lele又想了一个新点子:他 ...
随机推荐
- zookeeper 服务端上下线,客户端感知
package pfs.y2017.m11.zookeeper.demo03; import java.util.ArrayList; import java.util.List; import or ...
- Page Design for Sexable Forum
Design Demo 1. Home of Sexable Forum 1.1 home page not logined. 1,2 home page logined. 2. Pages wit ...
- 关于MP4视频拖动的原理与分析(一)
本来想说说关于mp4和一些常见视频文件格式方面的历史. 如今想想没啥必要.毕竟本文是在讲关于mp4点播拖动方面的技术细节. 绪论,前言神马的显得有点多余. 说起MP4.不得不提"Digita ...
- C++类使用static小例子(新手学习C++)
//为什么类的成员中不能包括动态分配的数据,若包含静态数据怎么使用?#include <iostream>using namespace std;class point{ priva ...
- js操作文件 HTML5版
js操作文件 HTML5版,有需要的朋友可以参考下. <!DOCTYPE html> <html> <head> <title>JSFileReader ...
- Appium&python
Appium官网所描述的特性,都很吸引人,刚好最近在研究Mobile Automation Testing,所以很有兴趣探索下Appium这个年轻的工具. 不过看了官网的documents,实在是让初 ...
- ASP.NET MVC判断基于Cookie的Session过期
当我们第一次请求访问时,可以看到Response的Set-Cookie里添加了ASP.NET_SessionId的值,以后再访问时可以看到Resquest里的Cookie已经包含这个Key. Se ...
- com.mongodb. org.mongodb.
- iOS 设置TextView控件内容行间距
- (BOOL)textViewShouldBeginEditing:(UITextView *)textView { if (textView.text.length < 1) { textV ...
- java 获取路径
1.利用System.getProperty()函数获取当前路径:System.out.println(System.getProperty("user.dir"));//user ...