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又想了一个新点子:他 ...
随机推荐
- zoj1232Adventure of Super Mario(图上dp)
题目连接: 啊哈哈.点我点我 思路: 这个题目是一个图上dp问题.先floyd预处理出图上全部点的最短路,可是在floyd的时候,把可以用神器的地方预处理出来,也就是转折点地方不能为城堡..预处理完成 ...
- Highmaps的天津地图数据JSON格式
Highmaps的天津地图数据JSON格式 Highmaps的天津地图数据JSON格式 下载链接: http://pan.baidu.com/s/1eQgxECU password: tjmj 天津地 ...
- Html.Partial
老革命永远都在遇上各种似是而非的老问题. 这次,是这个Html.Partial,分部页. Html.Partial与Html.Action有啥区别呢?区别就是,Html.Partial只有一个视图,而 ...
- HDU 6058 Kanade's sum 二分,链表
Kanade's sum Problem Description Give you an array A[1..n]of length n. Let f(l,r,k) be the k-th larg ...
- asp.net连接Access数据库实现登陆功能
这里话就不多说了,直接演示代码. 连接access数据库首先需要配置web.config <appSettings> <add key="AccessConnString& ...
- web 前端冷知识
前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...
- C、C++混合编程之extern "C"
为何要“混合编程”?举个例子: CHeader.h #ifndef C_HEADER_H #define C_HEADER_H void func(); #endif CHeader.c #inclu ...
- Android 返回键的处理
多网友不明确怎样在Android平台上捕获Back键的事件.Back键是手机上的后退键,一般的软件不捕获相关信息可能导致你的程序被切换到后台.而回到桌面的尴尬情况,在Android上有两种方法来获取该 ...
- 20170221 SE03 打包请求
请求处理:SE03 只会有其中两三个功能,还需要学习. 请求打包,是传输请求时候常用的一种方法. 步骤如下: 注意点:1.打包请求一定仔细检查,不要遗漏 如果请求不多,分开传是更好 ...
- javascript event事件兼容性处理
ie 6-8支持event事件,ff浏览器不支持 获取鼠标点击位置的坐标 document.onclick = function(){ alert(event.clientX +"-&quo ...