HDU Rank of Tetris

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1811

题意:中文问题就不解释题意了。

这道题其实就是一个拓扑排序判圈,我的博客里面其他几篇拓扑排序判圈的套路一样。但是这道题与他们不同的的是在大小关系里面存在一种 “=”的关系,这就意味的那些序号不同的点,实际上是一个点。共享入度和出度。我们可以通过并查集将他们合并,合成一个点。这里说一下如何判断信息不完全。我们早先在做拓扑排序,多种排列方式的时候,按照字典序输出。我们建立一个优先队列,维护字典序,这个时候堆里是有很多元素的,我们通过优先队列取出最小或者最大,实际上这些元素在拓扑排序中是等价关系,也就是说他们之间的大小关系无法比较。在这道题中,如果滞留在队列中的元素超过一个说明有两个元素无法比较的,就说明了答案是UNCLEARED。直接看代码吧!,具体细节写在注释里面了。

//Author: xiaowuga
#include <bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
const long long N=+;
using namespace std;
typedef long long LL;
vector<int>p[N];
int f[N];
int in[N];
struct node{
int x,y;
char ch;
}oj[N];
int n,m;
int ct=,flag=;
//并查集套路
int Find(int x){
return f[x]==x?x:f[x]=Find(f[x]);
}
void topo(){
queue<int>q;
while(!q.empty()) q.pop();
for(int i=;i<n;i++) if(!in[i]&&Find(i)==i) q.push(i);//首先得是并查集中的根,然后出度为0
while(!q.empty()){
if(q.size()>) flag=;//同级元素大于一个说明有至少有两个元素无法比较,所以信息不完全
int t=q.front();q.pop();
ct++;
for(int i=;i<p[t].size();i++){
int tmp=p[t][i];
if(--in[tmp]==) q.push(tmp);
}
}
if(ct!=n) cout<<"CONFLICT"<<endl;
else if(flag) cout<<"UNCERTAIN"<<endl;
else cout<<"OK"<<endl;
}
int main() {
ios::sync_with_stdio(false);cin.tie();
while(cin>>n>>m){
for(int i=;i<n;i++) f[i]=i;
memset(in,,sizeof(in));
for(int i=;i<n;i++) p[i].clear();
int x,y;
ct=flag=;
//先处理'='带来的点的减少,建立并查集缩点
for(int i=;i<m;i++){
cin>>oj[i].x>>oj[i].ch>>oj[i].y;
if(oj[i].ch=='='){
x=Find(oj[i].x);
y=Find(oj[i].y);
if(x!=y) {f[x]=y;ct++;}//缩点了别忘了ct++,因为相当于总点数减少了一个
}
}
//根据缩完点的点边关系,反向建图(正向建图也可以)
for(int i=;i<m;i++){
if(oj[i].ch=='=') continue;
x=Find(oj[i].x);
y=Find(oj[i].y);
if(oj[i].ch=='>'){
p[y].push_back(x);
in[x]++;
}
else{
p[x].push_back(y);
in[y]++;
} }
//并查集处理完建图之后就是常规的拓扑排序
topo();
}
return ;
}

在最小生成树的克鲁斯卡尔算法里,并查集被用来判断是否形成环路,正如我在我的其他几份博文里面说的那样,我认为在一个图中,如果出现环,那么环可以缩成一个点。环上的点实际上是等价的,也就是说并查集实际上是通过边的关系,说明两个不同的点,合并成一个点,通过一个根共享他们的信息。a=b全等价于a>b,a<b这样两条边。我们根据这个信息把a,b合并。通过一个根可以是a,也可以是b来查询这个整体的信息。总结一句并查集就是把一些不同的东西合并在一起,一起查询的工具。

HDU1811 拓扑排序判环+并查集的更多相关文章

  1. POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39602   Accepted: 13 ...

  2. Legal or Not(拓扑排序判环)

    http://acm.hdu.edu.cn/showproblem.php?pid=3342 Legal or Not Time Limit: 2000/1000 MS (Java/Others)   ...

  3. LightOJ1003---Drunk(拓扑排序判环)

    One of my friends is always drunk. So, sometimes I get a bit confused whether he is drunk or not. So ...

  4. HDU 1811 Rank of Tetris 【拓扑排序】+【并查集】

    <题目链接> 题目大意: 给你N个点(编号从0到N-1)和M个关系,要你判断这个图的所有点的顺序是否可以全部确定.不过对于任意点的关系可能存在A>B或A<B或A=B三种情况,如 ...

  5. HDU - 5438 Ponds(拓扑排序删点+并查集判断连通分量)

    题目: 给出一个无向图,将图中度数小于等于1的点删掉,并删掉与他相连的点,直到不能在删为止,然后判断图中的各个连通分量,如果这个连通分量里边的点的个数是奇数,就把这些点的权值求和. 思路: 先用拓扑排 ...

  6. [bzoj3012][luogu3065][USACO12DEC][第一!First!] (trie+拓扑排序判环)

    题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabe ...

  7. Almost Acyclic Graph CodeForces - 915D (思维+拓扑排序判环)

    Almost Acyclic Graph CodeForces - 915D time limit per test 1 second memory limit per test 256 megaby ...

  8. Communication【floyd判环+并查集】

    Communication 题目链接(点击) 题目描述 The Ministry of Communication has an extremely wonderful message system, ...

  9. 【CodeForces】915 D. Almost Acyclic Graph 拓扑排序找环

    [题目]D. Almost Acyclic Graph [题意]给定n个点的有向图(无重边),问能否删除一条边使得全图无环.n<=500,m<=10^5. [算法]拓扑排序 [题解]找到一 ...

随机推荐

  1. Spring学习10-SpringMVC原理及核心组件1

    一.SpringMVC原理     请求到来时,第一个接受这个请求的前端控制器叫DispatcherServlet(这个需要在web.xml中配置), 后端控制器叫Controller.负责处理请求U ...

  2. 466. Count Linked List Nodes【Naive】

    Count how many nodes in a linked list. Example Given 1->3->5, return 3. 解法一: /** * Definition ...

  3. 每日英语:Risk-Averse Culture Infects U.S. Workers, Entrepreneurs

    Americans have long taken pride on their willingness to bet it all on a dream. But that risk-taking ...

  4. java学习之局部变量以及全局变量

    全局变量 什么是全局变量? 全局变量就好比一个容器或者一个公用的东西一样,就类似外面公共场所的凳子一样,大家都可以使用这个凳子. 和他相反的局部变量是啥子东东呢? 局部变量就是局部的东西,如果全局变量 ...

  5. SAP ERP 6.0 EHP7 SR2(WINDOWS MSSQL版)安装说明

    原文 by 枫竹丹青 ⋅ 1.安装准备 1.1.版本说明 本文是描述在一个Windows虚拟机.SQL Server数据库环境下,安装SAP ERP 6.0 EHP7 SR2服务器,安装完成虚拟机文件 ...

  6. win7下如何显示缅文和使用缅文输入法?

    windows 7 操作系统默认不支持缅文,所以缅文在win7上不能显示,当然也没有提供缅文输入法. 一.显示缅文 windows系统下显示缅文字母只需要安装缅文字体就可以了.目前常见的缅文字体就是Z ...

  7. poj3067 Japan(树状数组)

    转载请注明出处:http://blog.csdn.net/u012860063 题目链接:id=3067">http://poj.org/problem? id=3067 Descri ...

  8. Unix系统编程()改变信号处置:signal

    Unix系统提供了两种方法来改变信号处置:signal和sigaction.这篇描述的是signal系统调用,是设置信号处理的原始API,所提供的接口比sigaction简单.另一方面,sigacti ...

  9. Unix系统编程()虚拟内存管理

    在之前学到过进程的内存布局中忽略了一个事实:这一布局存在于虚拟文件中. 因为对虚拟内存的理解将有助于后续对fork系统调用.共享内存和映射文件之类的主题阐述,这里还要学习一下有关虚拟内存的详细内容. ...

  10. 线段树 + 字符串Hash - Codeforces 580E Kefa and Watch

    Kefa and Watch Problem's Link Mean: 给你一个长度为n的字符串s,有两种操作: 1 L R C : 把s[l,r]全部变为c; 2 L R d : 询问s[l,r]是 ...